めっちゃ初歩的で恥ずかしいんですが、めっちゃ詰まってました笑
バージョン
go version
go version go1.17 darwin/arm64
## 事象
以下のように、golang.org/x/tour/
の下のパッケージをimport
するようなファイルが実行できない。
go run ./exercise-images.go
で実行したときのエラーは以下。
exercise-images.go:7:5: no required module provides package golang.org/x/tour/pic: go.mod file not found in current directory or any parent directory; see 'go help modules'
解決
モジュール化したいルートディレクトリに遷移して以下コマンドを実行します。
go mod init <モジュール名>
そうすると、再度go run
をすると
exercise-images.go:7:5: no required module provides package golang.org/x/tour/pic; to add it:
go get golang.org/x/tour/pic
と表示されるので、
go get golang.org/x/tour/pic
にて実行できました。
解説
Goの1.16のリリースからGO111MODULE
の規定値が変更されているみたいです。
このリリースが2021年2月で、比較的新しいのであまり探しても解決策が出なかったようです。。
解決策その1
Goの1.16以前の設定に戻して実行する方法です。
環境変数のGO111MODULE=auto
に設定すればOK。
go env -w GO111MODULE=auto
解決策その2(上に書いた方法)
go mod init
でモジュール化する方法。
何が違うの?
正直自分より詳しい人たちが書いた記事あるので、自分の簡単な理解を書いておきます。。
前者はGOPATHモードと言って、パッケージを全てGOPATH配下で管理するモードという理解です。
バージョンは1つしか管理しないため、異なるバージョンを使いたいときに困る。
後者はモジュールモードと言って、モジュールごとにパッケージを管理するモードです。
1.16からデフォルトでこちらを使用するようになったので、公式推奨です。
go.mod
ファイルの中でモジュール間の依存関係を記述します。このとき、バージョン込みで管理できるので、GOPATHモードのときのような問題は起こらなくなります。
以上