LoginSignup
72
42

More than 3 years have passed since last update.

Golang 1.11でGO111MODULE=onの状態でグローバルにgo getできない時の対処法

Last updated at Posted at 2018-12-14

Golang製のツールをgo getしようとした時、

go: cannot find main module; see 'go help modules'

とエラーが出力されキョトンとしてしまいました。
ググってみてもこれと言った明確な解決方が見つからなかったのですが、GolangのWikiのModulesページに対処法がまとまっていました。

結論

Golang公式にはいくつかの対処法が記載されていましたが、今回採用した手順は以下の通りです。

Goツール用のディレクトリを作成

僕はホームディレクトリに作成しましたが、基本的にはどこでもOKです。

mkdir go-tools
cd go-tools

Modulesの初期設定

以下のコマンドでGo Modulesのファイルが作成されます。

go mod init go-tools

go getの実行

例としてgo-langserverをインストールしたい場合は以下の通りです。uオプションはお好みで。

go get -u github.com/sourcegraph/go-langserver

これで$GOPATH/binにGo製のツールが追加され、グローバルで利用できるようになっているはずです。

補足

エラーが出るようになった原因

Go 1.11において、GO111MODULE=onを設定している場合、go.modファイルの存在するディレクトリでしかgo getが実行されなくなります。
GO111MODULE=onの挙動がGo 1.12から標準になるらしいので、今後は上で紹介したような方法や何かしらのツールを使った管理を行う形になるのかも知れません。

※ 前情報通り、Golang1.12からはgo.modファイルがなくてもgo getが実行できるようになりました。そのため今回紹介する手順は必要なくなっているかと思います。

その他の対処法

GolangのWikiのModulesページでは他にもグローバルにツールをインストールする方法がいくつか紹介されていましたので、その一部を紹介いたします。
他の方法や詳細を知りたい方はWikiの方をご覧ください。

GO111MODULE=onを辞める

GO111MODULE=onの時にModulesの仕様上go getのグローバル実行ができないのであれば、それをやめてしまえばいいという話。
環境変数からGO111MODULE=onを取り除くか、GO111MODULE=autoを設定するといいでしょう。

実行時だけGO111MODULE=onを外す

Go 1.12以降に備えてGO111MODULE=onはセットしたままで慣れておきたい、という場合、実行時だけModulesを外すという手もあります。

GO111MODULE=off go get example.com/cmd

エイリアスを設定しておくという方法も紹介されていました。

alias oldget='GO111MODULE=off go get'

 まとめ

掲載内容に誤りや疑問がありましたら、コメント・編集リクエストをいただけると大変助かります。
閲覧いただき、ありがとうございました。

72
42
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
72
42