Go言語のパッケージ管理ツール Go Modules
Go Modulesとは、Goのバージョン1.11から追加されたパッケージ依存管理ツールです。 Go言語ではGOPATHという特殊な概念があり、Go言語のコードはすべて`$GOPATH/src`配下に配置する必要がありました。
Go Modulesとは、Goのバージョン1.11から追加されたパッケージ依存管理ツールです。 Go言語ではGOPATHという特殊な概念があり、Go言語のコードはすべて`$GOPATH/src`配下に配置する必要がありました。
$GOPATH/src
配下に配置する必要がありました。例えば、私の環境でのGOPATHは/Users/{username}/go
でした。新たにfoo
というプロジェクトを作成する場合には、次のように配置します。shUsers├── {usernaem}│ ├── go│ │ ├── src│ │ │ ├── github.com│ │ │ │ ├── {githubユーザー名}│ │ │ │ │ ├── foo{githubレポジトリ名}
また、go get
コマンドで取得したライブラリも$GOPATH/src
配下に配置されることになります。プロジェクト固有のライブラリを配置したい場合には思いdepという依存管理ツールが使われていました。depを用いてライブラリを取得すると、$GOPATH/src/プロジェクト/vendor
に配置されます。go コマンドはvendor
配下のライブラリを優先的に見てくれます。それでも、やはり$GOPATH/src
にコードを配置するというルールは守る必要がありました。そこで登場したので、go Modulesです。Go Modulesですきなディレクトリにプロジェクトを配置できるようになりました。## プロジェクトを作成するそれでは実際に試し見ます。$GOPATH/src
以外の場所で適当なディレクトリを作成します。shmkdir some-go-projectcd some-go-project````go mod init`コマンドで、プロジェクトの初期化を行います。このコマンドは、GOPATH以外の場所で実行する際にはモジュール名を渡します。
shgo mod init some-go-projectgo: creating new go.mod: module some-go-project成功したら、`go.mod`ファイルが作成されます。
gomodule some-go-projectgo 1.15## ライブラリを含むファイルを作成プロジェクトが作成できたら、適当なライブラリを含むファイルを作成しましょう。なんでもよいのですが、ロギングライブラリである[logres](https://github.com/Sirupsen/logrus)を使用することにします。
gopackage mainimport ( "github.com/sirupsen/logrus")func main() { logrus.WithFields(logrus.Fields{ "animal": "walrus", }).Info("A walrus appears")}## ファイルを実行する以下コマンドで、作成したファイルを実行してみましょう。
shgo run main.go依存関係の解決とダウンロードを自動でやってくれて特になにも行っていないのにも関わらず実行に成功しました。
shINFO[0000] A walrus appears animal=walrusまた、同時に`go.sum`をいうファイルが作成されています。これは、依存モジュールのチェックサムを管理しているファイルです。`go.mod`も同様に追加されたライブラリが更新されています。
gomodule some-go-projectgo 1.15require github.com/sirupsen/logrus v1.7.0これらの作業は`go run`だけでなく、`go build`や`go test `を実行されたときにも行われます。なお、ライブラリそのものは`$GOPATH/pkg/mod/`に保存されています。## 依存ライブラリの一覧を取得`go list -m all`コマンドで、`go.mod`ファイルの一覧を取得できます。
shgo list -m allsome-go-projectgithub.com/davecgh/go-spew v1.1.1github.com/pmezard/go-difflib v1.0.0github.com/sirupsen/logrus v1.7.0github.com/stretchr/testify v1.2.2golang.org/x/sys v0.0.0-20191026070338-33540a1f6037## 依存ライブラリの更新一度`go.mod`に記述がされるとそのバージョンが更新されることはありません。ライブラリのバージョンを上げたい場合には、`go get`コマンドを使用します。
shgo get github.com/sirupsen/logrus## 依存ライブラリの削除依存ライブラリの削除をするまえにまず、`import`している箇所を削除する必要があります。
gopackage mainimport "log" // これは標準のログパッケージ// "github.com/sirupsen/logrus"func main() { // logrus.WithFields(logrus.Fields{ // "animal": "walrus", // }).Info("A walrus appears") log.Print("Hi!")}この状態で`go run main.go`を実行したとしても`go.mod`ファイルからは削除されません。コマンドで明示的に削除してやる必要があります。
shgo mod tidy```これで、go.mod
・go.sum
から依存ライブラリが削除されました。# 参考Using Go ModulesGo ModulesGOPATHを掃除してGo Modulesに移行しようGo言語の依存モジュール管理ツール Modules の使い方