🍖

VSCodeからGolandへ乗り換えたい人向けに私がやった対応の共有

2024/07/22に公開

前置き

ずっとvscodeでgoの開発をしていたのですが、仕事のあれやこれやでGolandを利用することになりました。
流れに逆らってvscodeのまま開発を続けても良いかなと思っていたのですが、Golandのリッチな機能を使いこなせるならそれに越したことはありません。

幸い、個人的に学生ライセンスでJetbrainsのすべてのツールをプライベートでも利用できる状況ですので、これを機会にGolandを使いこなしてやるか!となりました。

やりたいこと

やりたいことはたくさんあるのですが、Golandでの開発にあたり、とりあえず最低限のラインとして、私の中で必須でできるようになってほしい観点があります。

  • linterはgolangci-lintを使う
  • formatterはgofumptを使う
  • 環境変数を.envファイルから読みこんでからgo testを実行できるようにする
  • 上記の設定をexportしてリポジトリ管理できるようにし、チームメンバーがスムーズに開発できるようにする

上記ができるようになれば一旦は大丈夫そうかな?とか思っています

VSCodeだとどうやる?

goの公式拡張機能を入れれば簡単に可能です

https://zenn.dev/tellernovel_inc/articles/8a1ac1f1652605

こちらで紹介されているように、settings.jsonにこれらの設定を加えます

{
  "go.useLanguageServer": true,
  "go.inlayHints.assignVariableTypes": true,
  "go.inlayHints.compositeLiteralFields": true,
  "go.inlayHints.compositeLiteralTypes": true,
  "go.inlayHints.constantValues": true,
  "go.inlayHints.functionTypeParameters": true,
  "go.inlayHints.parameterNames": true,
  "go.inlayHints.rangeVariableTypes": true,
  "gopls": {
    "formatting.gofumpt": true
  },
  "go.testEnvFile": ".env", // 環境変数を.envファイルから読みこんでからテスト実行
  "[go]": {
    "editor.defaultFormatter": "golang.go"
  },
  "go.lintTool": "golangci-lint",
  "go.lintFlags": ["--fast", "--config", ".golangci.yml"]
}

  • linterはgolangci-lintを使う
  • formatterはgofumptを使う
  • 環境変数を.envファイルから読みこんでからgo testを実行できるようにする
  • これらの設定をexportしてリポジトリ管理できるようにし、チームメンバーがスムーズに開発できるようにする

これでとりあえずはvscodeでの開発はなんとかできそう

Golandではどうやる?

色々調べながらやったのですが、結構めんどくさかった。。。
もちろん、慣れていないからというのはありますが。

linterはgolangci-lintを使う

golangci-lintは専用のプラグインをinstallしないといけません。公式ドキュメントを参考に設定しましょう
https://golangci-lint.run/welcome/integrations/#goland

設定が終わったら、.idea/watcherTasks.xmlファイルを吐き出してリポジトリ管理できるようにしましょう。以下は吐き出した設定ファイルの一例です。

<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="ProjectTasksOptions">
    <TaskOptions isEnabled="true">
      <option name="arguments" value="run --fast --fix --config $ProjectFileDir$/.golangci.yml $FileDir$" />
      <option name="checkSyntaxErrors" value="true" />
      <option name="description" />
      <option name="exitCodeBehavior" value="ERROR" />
      <option name="fileExtension" value="go" />
      <option name="immediateSync" value="false" />
      <option name="name" value="golangci-lint" />
      <option name="output" value="" />
      <option name="outputFilters">
        <array />
      </option>
      <option name="outputFromStdout" value="false" />
      <option name="program" value="golangci-lint" />
      <option name="runOnExternalChanges" value="false" />
      <option name="scopeName" value="Project Files" />
      <option name="trackOnlyRoot" value="true" />
      <option name="workingDir" value="$ProjectFileDir$" />
      <envs>
        <env name="GOROOT" value="$GOROOT$" />
        <env name="GOPATH" value="$GOPATH$" />
        <env name="PATH" value="$GoBinDirs$" />
      </envs>
    </TaskOptions>
  </component>
</project>

開発に必須なプラグインをexportしてすぐにインストールできるようにする

Go Lintersはgolangci-lintを使えるようにするための必須プラグインです。
他のチームメンバーにも利用してほしいのですが、そのままだと手順書などに〇〇というプラグインをインストールしてください。と各必要があります。

必須プラグインとして設定ファイルをexportできるので、プラグインがインストールされていない場合、インストールする必要がある旨の通知が届きます。

ここで設定すると・・・
.idea/externalDependencies.xml というファイル名で吐き出されます

公式ドキュメントはこちら
https://pleiades.io/help/go/managing-plugins.html#required-plugins

環境変数を.envファイルから読みこんでからgo testを実行できるようにする

これが意外とめんどくさかった・・・

vscodeのgo拡張機能の場合、.envを読み取ってから実行してくれるgo.testEnvFileという設定があります。

golandも似たようなものがあるのかな?と思ったら実はなく、、、かなりめんどくさい事に気づいてしまう・・・

goland公式のやり方では実行構成設定で環境変数を直接打つことしかできないです。

https://future-architect.github.io/articles/20200519/
実行構成設定をexportすればなんとかなるのかなと思ったのですが

  1. 実行構成設定ファイルにsecretsな値を入れたい場合、リポジトリに直接あげられないのでcp .env.example .env のような運用がここでも発生してしまうこと
  2. これらの設定はgoland利用者でしか旨味がでないので、vscodeやその他の開発者向けのために.envファイルを別途用意する必要がある。そうなると二重管理になってしまうのでできればやりたくない

なので、公式のやり方だとチーム開発では難しいんじゃないのかなーと思ったりします。

以下は私が試してみたいくつかのやり方

パターン1: サードパーティのプラグインEnvFile を使う

なにも考えずに手っ取り早くするならこれが一番楽です。

https://plugins.jetbrains.com/plugin/7861-envfile
ただこのプラグイン、リポジトリを見ると更新が止まっているように見えます。将来性を考えたら使い続けるのはちょっと怖い。どうして公式が対応してくれないんだ・・・・

他のデメリットとしてはターミナル経由での実行をする際に環境変数を読み取ってくれないので別途やり方を考えないといけないです

パターン2: direnvを使う

direnv exec <path/to/project> goland <path/to/project>コマンドを使ってgolandをターミナルから起動します。

direnvについて知らない人はこちら
https://direnv.net/

golandをターミナルから起動する方法はこちら

https://www.jetbrains.com/help/go/working-with-the-ide-features-from-command-line.html

この方法を取ることで、goland上では.envに記載の環境変数が読み取られた状態で開発作業が実行できます。

デメリットとして、上記コマンド経由で実行しないと環境変数を読み取ってくれないのでかなり利便性が低いです。

パターン3: devcontainer経由でgolandを起動する

Dockerfileやdocker-compose経由でdevcontainer環境を立ち上げれば環境変数を読み取った状態で開発環境が起動するので特に何も苦労することなく開発が可能です。

デメリットとしては、環境変数の更新のためにコンテナの立ち上げをし直さなければならないことと、そこそこ性能が良いPCでないとパフォーマンスに影響が出てしまいそうだなというところかなと思います。

まとめ

今回の検証で利用したファイルはリポジトリに上げています

https://github.com/u-yas/goland-share-settings

goland、環境変数周りでちょっと躓きそうですが機能的には色々良さそうなものがあったりして便利そうなのでこれから使いこなしていきたいですね!

Discussion