68
40

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

goenvを1.23系から2系にしたときにGOPATHでハマった話

Last updated at Posted at 2019-04-08

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さん、ありがとうございました。

68
40
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
68
40

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?