モノレポの開発をGoLandで行うときに設定したいこと
目次
はじめに
こんにちは。株式会社ハイヤールーの@icchy_sanです。
ハイヤールーアドベントカレンダー 2022 19 日目の記事です。
本記事では、GoLand を用いてモノレポ構成の弊社プロジェクトを開発している中で僕が行った設定について紹介します。なお、弊社のモノレポの構成については、「モノレポでマイクロサービスを開発するための戦略と運用」で紹介しています。この構成で開発していく中で、GoLand を初期設定のまま利用していると複数ディレクトリに分散している proto ファイル同士の補完が効かなくなったり、弊社の非公開パッケージのインポートができなかったりしたため、カスタマイズをしました。
以上のことから本記事ではこの対応策について書きます。
そのため、本記事を読むことで次の事ができるようになります。
- GoLand 標準のコードフォーマッター以外を利用したコードのフォーマットができるようになる
- 分散した proto ファイルの参照ができるようになるため、proto ファイルを編集する際に補完が効くようになる
- 非公開のレジストリにホストしている Go のパッケージを GoLand の Sync dependencies 機能を利用して取得できるようになる
なぜ GoLand で開発をするのか
GoLand とは
GoLandは、JetBrains 社が提供している IDE で Go で開発する際に主に利用されます。
Go での開発時に利用する機能が搭載されているため、カスタマイズしなくても補完機能などのコーディングのサポートを受けながら開発できます。
自動的に依存パッケージが import に追加される
例えば次の gif1 のように、log.Printlnを利用する場合に Go に特化していないような汎用的なエディタの場合、import句にlogパッケージを追加し、log.Println(“sample log”)と入力する必要があります。
しかし、GoLand では初めに log.Printlnを補完して入力することで自動的に必要なパッケージが import 句に追加されます。これは依存するパッケージが多ければ多いほど重宝されます。
gif1. IDE による補完
Debugger を用いた開発ができる
IDE なので Debugger も標準搭載されており、ブレークポイントを持ちたデバッグができます。ブレークポイントを置くことでデバッグモード実行の際にステップ実行が可能になります。
gif2 が示すように、デバッグビルド(IDE のメニューバーにある虫のアイコンをクリック)を実行することでブレークポイントが設定されている場合にそこで処理がストップし、これまで変数に格納されてきた値を確認することができます。また、ブレークポイントの位置からはステップ実行ができるため、1 つ 1 つ処理を追いながらデバッグすることが可能です。
ブレークポイントを用いた開発により、実際に変数に入っている値を確認しながら処理を追うことができるため、良きせぬ値が入っていた場合にもすぐに気づくことができ、デバッグ時の手助けになります。
GoLand 以外の IDE やテキストエディタにもブレークポイント機能があるものも存在します。しかしプラグインを導入する必要があったり、利用するための設定が難しかったりすることがあります。一方標準搭載されている GoLand の場合はすぐさま利用することができるため、すぐさまコーディングに集中することが可能となります。
gif2. ブレークポイントを用いた実行
行っておくと良い設定 3 選
1. File Watchers を用いたフォーマッターの設定と実行
File Watchersとは、GoLand で変更したファイルを保存する際に自動的にコードの整形、あるいは実行を行ってくれるツールです。
2 つの例を通して設定方法を見ていきます。
1.1 File Wachers による保存時の goimports 実行設定
GoLand の場合、標準設定でも Go のコードを書きながら補完時に自動で依存パッケージをインポートしてくれはしますが、逆に自動で不要なインポートを削除すると言うことは行ってくれません。
Go のコードを書く中で、go fmtやgoimportsを利用してコードを整形してる開発者の方ともいるかと思います。そこで今回の File Watchers を利用することで保存時に自動でgo fmtやgoimportsを行う設定をします。
設定としては次の 3 ステップです。
- GoLand の「設定」を開く
- 検索欄で「file watchers」と検索する(図 1)
- 表示されるペーンの「+」ボタンをクリックし、「goimports」を選択し設定そのままで「OK」ボタン押下
gif3. GoLand の File Wathcers の設定方法
gif3 の最後に行を削除していますが、この時fmtパッケージがファイル内で利用されなくなったことで保存時にインポートから削除されています。初期設定の場合は削除した際に不要なインポートが削除されないため、保存時にコードフォーマットや不要なインポートを削除したい場合はぜひ設定してみてください。
1.2 標準で用意されていないフォーマッターの設定
File Watchers の設定方法がわかったところで、少し応用してみます。
File Watchers には「+」を押下時に<custom>という選択肢があります。これを利用することでプリセットで用意されている物以外でも利用することができます。
例えば、ここでは GoLand の標準で設定されていない Terraform のフォーマットを設定する場合を挙げて説明します。Terraform にはterraform fmtコマンドがあり、実行するとファイルのフォーマットを行ってくれます。File Watchers の設定を行うことで GoLand 上でファイル保存時にファイルのフォーマットができます。
※筆者は terraform のプラグインを入れているため terraform の拡張子がありますが、標準設定ではないのでご注意ください。
設定方法としては次の通りです。(図 1)
- 「File Watchers」の設定ページの「+」し
<custom>を選択 Nameに任意の名前をつける(terraform の fmt を実行するためterraform fmtと命名)File typeには監視する対象のファイルの拡張子を設定します。Programには実行するコマンドを入力します。今回は terraform コマンドを実行するためterraformを設定Argumentsには terraform コマンドで実行する引数を入力します。terraform fmt ファイル名を実行するためfmt $FilePath$とします。($FilePath$は GoLand で利用できるマクロで、ファイルへの絶対パスを表します)Output paths to refreshには File Watchers で実行されるコマンドの出力を行う場所を指定します。フォーマットなので、$FilePath$を設定しておきます。
図 1. terraform fmt 用の設定
以上の設定を行うことで、Terraform のファイル保存時に自動でフォーマットを実行してくれます。
設定ができた場合の挙動を確認してみると gif4 通りです。
gif4. 保存時にterraform fmtが走る様子
2. 別ディレクトリにある proto を IDE 内で参照できるようにし、補完可能にする設定
別のディレクトリで管理されている proto ファイルをこれから編集する proto ファイルへインポートする際に初期設定では参照することができず、補完が効きません。そのため、インポートする proto ファイルに定義されている message を全て確認しながら手入力する必要があり非効率になります。
ここで紹介する設定を行うことで、インポートした proto ファイルに定義されている message の補完が効くようなります。
ディレクトリ構成としては次の物を想定しています。
├── service_a
│ └── proto
│ └── v1
│ └── service_a.proto
└── service_b
└── proto
└── v1
└── service_b.proto
service_aはservice_bの proto をインポートします。
また、service_b.protoは次のようなファイルです。
syntax = "proto3";
package sample.proto.service_b.v1;
message ServiceB {
int64 id = 1;
}
まずは初期設定の状態でservice_a.protoでservice_b.protoを参照すると図 2 のようにimport部分が赤くなっており正しく参照されません。また、マウスをホバーするとCannot resolve import 'service_b/proto/v1/service_b'というエラーがでます。
図 2. 初期設定のままservice_a.protoでservice_b.protoの内容をインポートした場合の図
この状態が確認できたら、正しく読み込むことができるように設定していきます。
設定手順については 1 の Protocol Buffers のプラグインのインストールを除き、gif5 で行っていることに対応させています。
- 図 3 の四角の枠で括っているProtocol Buffers のプラグインをインストールしておきます。
- 設定の「Language & Frameworks > Protocol Buffers」を選択する
- 「Configure automatically」のチェックを外す
- 「+」を押し、proto ファイルをインポートしているパスのルートディレクトリを指定する(
service_b/proto/v1/service_b.protoの場合、service_bの親ディレクトリを指定する) - 「OK」を押下する
図 3. インストールする Protocol Buffers プラグイン
gif5. Protocol Buffers の補完設定
この設定を行うことで分散している proto を参照することができるようになるため、fig6 のように補完も効くようになっています。
gif7. 別ファイルの proto ファイルをインポートする場合の例
service_bディレクトリ同様にservice_cディレクトリを作成したとしてもservice_bと同階層に作成することでそちらも補完が効きます。
そんためモノレポの場合、同階層に複数プロジェクトを配置するため他のプロジェクトを新規作成したとしても設定を変更することなく新規プロジェクトにも適用することができます。
3. 非公開レジストリにホストしてるパッケージを取得する設定
GoLand の初期設定ではSync dependencieが参照するレジストリは公開されているものに限ります。これはもちろん GoLand に限った話ではなく、Go の環境変数を適切に設定していない環境であればどこでも起こり得ます。
あくまでここで述べるのは、GoLand の機能を通して go get する際に非公開レジストリからパッケージを取得する部分に限ります。
設定としては図 3 の通りであり、設定手順を以下に示す。
- 設定の「Go > Go Modules」を開く
- 「Enable Go modules integration」にチェックを入れる
- 「Environment」に GOPRIVATE などの非公開レジストリにアクセスするための環境変数を設定する
図 4. Go の環境変数の設定
正常に設定されると、sync dependencies 経由でgo getを実行し依存解決ができるようになるため、毎回go getだけターミナルへ移動して実行という手順を踏む必要がなくなります。
おわりに
本記事では GoLand でコードを書く設定について紹介してきました。
GoLand は Go のコーディングに特化した IDE ということもあり、初期設定のままでも開発を行うことができます。
しかし、標準設定だけではかゆいところに手が届かない場合があります。
そこで今回紹介した
- File Watchers
- Protocol Buffers の参照の解決
- sync dependencies 経由での非公開レジストリへのアクセス
を使うことにより細かいところまで設定できるため、保存時のフォーマット処理を自動化できたり、コーディングする際のサポート力が上がったりします。
ぜひご活用ください! 明日はIwata-sanによる「valtio と redux の比較」です!