TL;DR;
- goenvは2.0系(とりあえずbeta6想定)からGOPATHを管理してくれるようになった
- 基本的には、この動作は妥当なので、おとなしく従った方が良さそう
- この挙動は環境変数を
GOENV_DISABLE_GOPATH=1
と設定することで抑止できる - 2.0系はbeta版なので(2019/4/8現在)betaが付いてない最新版1.23.3を使った方がいいかもしれない
注意: Go Modulesの話は書きません
問題の発覚
- goenvは公式の説明の通り
git clone https://github.com/syndbg/goenv.git ~/.goenv
で導入 - 元々、
GOPATH=~/go
を前提に諸々の組んでいた - PATHも
~/go/bin
に通していた(.bash_profile等で設定) - goenvでgoをインストール
goenv install 1.11.0
goenv global 1.11.0
- パッケージ管理のdepも
go get -u github.com/golang/dep/cmd/dep
でインストール - プロジェクトのディレクトリで
dep ensure
すると-bash: dep: command not found
- ん?インストール先を見てみる
> ls ~/go/
1.11.0
> ls ~/go/1.11.0
bin src
- 確かこうだったような…
> ls ~/go/
bin src
goenvの仕様変更
何でだろうと思い、変更履歴を見てます。
すると2.0.0beta6にこんな記述があります。
Changed goenv's bootstrap (eval $(goenv init -)) now to call goenv-sh-rehash --only-manage-paths. This means that it'll export and manage GOROOT and GOPATH env vars
つまり、goenvが使ってるバージョンごとにGOROOTとGOPATHを管理・変更してくれる、と。
例えば1.11.0を使っている場合はこうなります。
> echo $GOPATH
/home/ユーザ名/go/1.11.0
ふむふむ、分かるよ。
バージョンごとに置くべきだよね。
自分のソースも /home/ユーザ名/go/1.11.0/src
配下に置けばいいんだよね。
妥当だ。
ただ、~/go/src
配下にあることを前提としたアレコレがあったり、とりあえず今はこちらの指定したGOPATHに従ってほしい……。
※補足: Go Modulesの話が出ると話が違ってくるので、参考サイトだけ貼ってお茶を濁しておきます。
回避方法
古いgoenvを使う
公式ではgit clone https://github.com/syndbg/goenv.git ~/.goenv
とmasterを取得する方法が紹介されていますが、バージョンを指定してインストールすることもできます。
(そもそも、2019/4/8現在、masterにあるのは2.0.0のβ版なので、これ使うのが妥当かどうかは微妙な気もします)
ということで、git clone https://github.com/syndbg/goenv.git -b 1.23.3 ~/.goenv
と2系になる前の最新をタグで指定してインストールすれば、従来通りです。
GOENV_DISABLE_GOPATHでGOPATHの管理を拒否する
README等の資料には記述がありませんが、変更履歴#2.0.0beta6を見るとこんな記述があります。
Add management of env variable GOPATH that can be disabled with env var GOENV_DISABLE_GOPATH=1, when calling goenv-sh-rehash (goenv rehash when eval $(goenv init -) was previously executed).
つまり、GOENV_DISABLE_GOPATH=1
を設定しておけば、GOPATHを管理する機能を無効化できるわけですね。
# ~/.bash_profile
export GOENV_ROOT="$HOME/.goenv"
export PATH="$GOENV_ROOT/bin:$PATH"
export GOENV_DISABLE_GOPATH=1
eval "$(goenv init -)"
export PATH="$GOROOT/bin:$PATH"
export GOPATH="~/go"
export PATH="$GOPATH/bin:$PATH"
この状態で例えばこの辺をインストールしてやれば、従来通り、~/go
(正確には自前で設定したGOPATH)直下にインストールできます。
> go get -u github.com/golang/dep/cmd/dep
> ls ~/go
bin src
> ls ~/go/bin
dep
謝辞
諸々助言をくれたKurosawaさん、momoさん、ありがとうございました。