0
0

More than 1 year has passed since last update.

anyenv + goenv + vscodeの環境で正しくlocalのバージョンを参照しない

Last updated at Posted at 2022-02-08

最近、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言語ライフを!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0