LoginSignup
0
0

More than 5 years have passed since last update.

【Tips】go1.11+google/wireの組み合わせで起きたエラー解消方法

Posted at

お題

ただの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 は使わなくなるのかな。

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