お題
ただのTips。
Google純正のGoで書かれたDIツールである wire を使おうとして発生した問題と解消方法。
※現在自分が使用しているGoのバージョンは「1.11」、その環境下において発生した問題
表題の組み合わせで同じエラーが起きた人向けなので、そもそもgoogle/wireとは?といったことは説明しない。
作業環境
# OS
$ cat /etc/os-release
NAME="Ubuntu"
VERSION="18.04.1 LTS (Bionic Beaver)"
# 言語
$ go version
go version go1.11.4 linux/amd64
本題
wireインストール時の問題
公式のREADMEに「 go get github.com/google/wire/cmd/wire
」でインストールするように書いてあったのでトライ。
https://github.com/google/wire#installing
すると、まさに↓に書いてある通りのことが発生した。
https://qiita.com/x-color/items/3b3acd3bcab74e1f15ca
なので、上記にならって、以下のようにして解決。
端末エミュレータを開いて、GOPATHをセット。
言わずもがなだけど、↓ではコマンド叩いてセットしてるが ~/.bashrc
あたりに書いておくといい。
※必要なディレクトリは、あらかじめ掘ってある前提
$ export GOPATH="/home/sky0621/work/src/gopath"
$ cd $GOPATH/src/github.com/google
$ git clone https://github.com/google/wire.git
$ cd wire/cmd/wire
$ go install
$
$ ls -l $GOPATH/bin | grep wire
-rwxr-xr-x 1 sky0621 sky0621 7424404 2月 17 23:08 wire
当然ながら、上記の $GOPATH/bin
にはパスを通しておく。
wireコマンド実行時の問題
google/wireのGitHubソースにチュートリアルがあったので、まんま同じソースを書いて、 wire
コマンドを叩いてみると、・・・。
$ wire
go [list -e -json -compiled -test=false -export=false -deps=true -find=false -tags=wireinject -- .]: exit status 1: go: cannot determine module path for source directory /home/sky0621/work/src/go111/src/github.com/sky0621/try-googlewire (outside GOPATH, no import comments)
wire: generate failed
う〜ん、とにかく GOPATH
外ではダメな様子。
ソースを GOPATH
に置かなくてよくなった Go1.11 と、 GOPATH
内でないと叩けない wire コマンドは相容れない?
ふと、↓の記事に「GO111MODULE」について書かれていたことを思い出す。
https://budougumi0617.github.io/2019/02/15/go-modules-on-go112/
Go1.11では、ライブラリ管理には「Go Modules」を使っている。
この「Go Modules」は「GOPATH mode」と「module-aware mode」という2つのモードがあるらしい。
・GOPATH mode
=標準pkg以外を全部 GOPATH 以下のディレクトリで管理
・module-aware mode
=標準pkg以外の全てのパッケージをモジュールとして管理
これらのモードをどう扱うかが環境変数「GO111MODULE」のセット内容によって変わるのだとか。
最初にGo1.11をインストールした時に見た記事に「export GO111MODULE=on
」と書いてあって、何も理解せずそのまま環境変数にセットしていた。
こうすると、常に「module-aware mode」で動作するらしい。
で、環境変数「GO111MODULE」のセット方法には「on」「off」「auto」の3つがあり、「auto」の場合は、
『$GOPATH 配下ではGOPATH modeで,それ以外のディレクトリではmodule-aware modeで動作する』とのこと。
というわけで、試しに、・・・。
$ export GO111MODULE=auto
$
$ wire
_/home/sky0621/work/src/go111/src/github.com/sky0621/try-googlewire: wrote /home/sky0621/work/src/go111/src/github.com/sky0621/try-googlewire/wire_gen.go
$
$ ls -l wire_gen.go
-rw-r--r-- 1 sky0621 sky0621 336 2月 17 22:22 wire_gen.go
うん、出来た。
ちょっと理屈がわかっていない。。。
「Go Modules」に関しては、ちょうど今が GOPATH
から「Go Modules」への過渡期のよう。
Go1.13 ぐらいからは基本的に GOPATH
は使わなくなるのかな。