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