nato243 weblog.n-jitter brand iconweblog.n-jitter
テクノロジー

VSCodeのGolangモノレポ設定

2025.02.22
Golang

昨今、IDEでもAI系のプラグインが隆盛である。
Clineはもとより、GitHub Copilotなどがそれに該当する。
これらのIDE向けプラグインでは、ファーストサポートにVSCodeがまず選ばれることが多い。

自分はAndroid開発を昔していた流れで、GoやTypeScript系のWeb開発でもJetbrains系IDEをわりと惰性で使ってきたところがある。ただAI系の新機能のペースに追いつくことにも興味はあるので、いよいよIDE移行しないとだめかなあ、と徐々にVSCodeの肌感を得ようとしている。

今回はその中で、Go言語系の開発で詰まったとこのメモ。

Goのモノレポ構造

以下のような複数のgo.modをもつリポジトリを開発する。 
Jetbrainsではgoファイルごとに勝手に近い親のgo.modを判定し、そこをルートとして認識してくれていた。
逆に、VSCodeはモジュールのImportエラーを起こしてしまう。

これを解決したい。

.
└── prj
    ├── project1
    │   └── go.mod
    └── project2
        └── go.mod

以下の3パターンの方法を見つけた。
Bが一番それっぽい気がしている。


A. go.modがあるフォルダごとに作業環境を開く

一番愚直なパターン。
なんかスマートではない。

B. go workによる設定

Go workspaces (go work) は Go 1.18 で導入された機能で、複数のモジュールを含むプロジェクトを効率的に管理するための仕組みらしい(いままで使ってなかった)。

主な特徴と利点:

  • 複数モジュールの管理
  • プロジェクトのルートディレクトリに配置する

まさに今回の要件向けの機能らしい。

go work use ./prj/project1 ./prj/project2
go 1.23

use (
    ./prj/project1
    ./prj/project2
)

C. VSCodeの個別settings.jsonによる設定

VSCodeのworkspace機能を使う場合、go.modがある傘下プロジェクトの各所に .vscode/settings.json を置くことでもエラー表示を消すことができた。

{
    "go.goroot": "/Users/xxxxx/.goenv/versions/1.23.1",
     "go.buildTags": "goexperiment.rangefunc" // add this line
}