最近、Goの環境の管理をanyenv + goenvに移行したhk220です。こんばんわ。
anyenv + goenvの環境で、vscode + Goプラグインを使うとちょっと困ったことが起きたので、忘備録として残します。
動作を確認した環境
- Windows 11 Pro
- WSL2 Ubuntu 20.04
- Visual Studio Code 1.64.0
- Goプラグイン v0.31.0
- Remote WSL v0.64.2
- bash 5.0.17(1)
- anyenv 1.1.4
- goenv d59c0489a133e0233b9bddfd2c1fb29b1e898198
そもそも何が起きたか?
anyenv + goenvを導入したWSLの環境で、goenv localでバージョンを指定しているリポジトリをvscode + Remote WSLで開いてGoプラグインによる自動ツールインストールを実行したところ、goenv globalで指定したGoのバージョンでビルド+インストールが実行された。
原因
パスの順番が以下になり、shimsにあるgoではなく$GOROOT/binにあるgoバイナリが実行されてしまうため。
# WSL内で起動させるbashによって、二回目のeval "$(goenv init -)"の実行によってshims以外のパスが追加される。
$GOENV_ROOT/bin
↓
# WSL内で起動させるbashによって、二回目の~/.bashrcの実行によって以下が追加される。(1回目と同じもの)
$HOME/.anyenv/bin
↓
# Remote WSLによって実行されるvscode-serverkで動くGoプラグインは、goenv globalによって設定されたGOROOTを参照してパスを追加する
# GOROOT=$HOME/.anyenv/envs/goenv/version/[global]
$GOROOT/bin
↓
# vscodeのあれ
$HOME/.vscode-server/bin/[hash]/bin/remote-cli
↓
# 一回目のeval "$(goenv init -)"の実行によって、以下のパスが追加される。
$GOENV_ROOT/shims
$GOENV_ROOT/bin
↓
# 一回目の~/.bashrcの実行によって以下が追加される。
$HOME/.anyenv/bin
↓
/usr/local/binとか・・・
bashrcでeval "$(anyenv init -)"
が複数回呼ばれ、それに伴いeval "$(goenv init -)"
が複数回呼ばれたときに、goenvが新たにPATHに$GOENV_ROOT/shims
をパスに追加しない仕組みになっているため、shimsではなく$GOROOT/binにあるgoバイナリを参照してしまう。
対処
eval "$(anyenv init -)"
の実行のあとに、$GOENV_ROOT/bin
を追加するようにする。
# anyenv
export PATH="$HOME/.anyenv/bin:$PATH"
eval "$(anyenv init -)"
# goenv
export PATH="$GOENV_ROOT/shims:$PATH"
これにより、$GOENV_ROOT/shimsが先に来るためそちらのgoバイナリを呼ぶようになる。
あとがき
これで、anyenv + goenv + vscodeの環境ができました!
みなさんもよきGo言語ライフを!