Modules を使うには

Modules は、Go言語 1.11 以上のバージョンである必要があります。
1.11 以上をインストールすると、go mod コマンドが使えるようになります。

Modules を使う流れ

Modules を使う流れは以下のとおりです。

go mod init で、初期化する

go buildなどのビルドコマンドで、依存モジュールを自動インストールする

go list -m all で、現在の依存モジュールを表示する

go get で、依存モジュールの追加やバージョンアップを行う

go mod tidy で、使われていない依存モジュールを削除する

実は go mod を直接実行することは少なく、他の go サブコマンドを実行したときに、自動的に処理が行われることが多いです。

以降は、コマンド実行例をご紹介します。
本記事では、バージョン 1.12 で動作確認しています。

1. go mod init で、初期化する

新規プロジェクトを作成して、 go mod init を実行します。
このコマンドには、引数としてモジュール名(example.com/go-mod-test)を指定します。

$ mkdir go-mod-test
$ cd go-mod-test
$ go mod init example.com/go-mod-test

go.mod ファイルが作成されます。
以下のように、指定したモジュール名が記載されています。

$ cat go.mod
module example.com/go-mod-test

go 1.12

2. go buildなどのビルドコマンドで、依存モジュールを自動インストールする

まずビルド対象となるプログラムを作成しておきます。
以下のプログラムを main.go という名前のファイルで保存します。

package main

import (
    "github.com/aws/aws-lambda-go/events"
    "github.com/aws/aws-lambda-go/lambda"
)

func handler(request events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {
    return events.APIGatewayProxyResponse{}, nil
}

func main() {
    lambda.Start(handler)
}

このプログラムでは、AWS Lambda のハンドラを実装しているので、aws/aws-lambda-go モジュールに依存している状態です。
ビルドコマンドを以下のように実行してみます。

$ go build
go: finding github.com/aws/aws-lambda-go/lambda latest
go: finding github.com/aws/aws-lambda-go/events latest

依存モジュールがインストールされている様子が出力されると思います。
go.mod の内容を見ると、依存モジュールの情報が記載されていることが確認できます。

$ cat go.mod
module example.com/go-mod-test

go 1.12

require github.com/aws/aws-lambda-go v1.13.2

3. go list -m all で、現在の依存モジュールを表示する

以下のように、現在の依存モジュールを確認してみます。

$ go list -m all
example.com/go-mod-test
github.com/BurntSushi/toml v0.3.1
github.com/aws/aws-lambda-go v1.13.2
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d
github.com/davecgh/go-spew v1.1.0
github.com/pmezard/go-difflib v1.0.0
github.com/russross/blackfriday/v2 v2.0.1
github.com/shurcooL/sanitized_anchor_name v1.0.0
github.com/stretchr/objx v0.1.0
github.com/stretchr/testify v1.4.0
github.com/urfave/cli v1.22.1
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405
gopkg.in/yaml.v2 v2.2.2

本プロジェクトで直接依存しているモジュールだけでなく、依存モジュールが依存しているモジュールもすべて出力されています。

4. go get で、依存モジュールの追加やバージョンアップを行う

試しにログ出力のための golang/glog をインストールしてみます。

$ go get github.com/golang/glog
go: finding github.com/golang/glog latest

以下のように go.mod ファイルにインストールしたモジュールの情報が追記されています。

$ cat go.mod
module example.com/go-mod-test

go 1.12

require (
        github.com/aws/aws-lambda-go v1.13.2
        github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b // indirect
)

// indirect というコメントは、直接依存しているモジュールではないことを表しています。
先程作成したプログラムでは、まだ golang/glog を使用していないので、このようなコメントが追記されています。

5. go mod tidy で、使われていない依存モジュールを削除する

以下のように、使われていない依存モジュールを削除してみます。

$ go mod tidy
go: downloading gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405
go: extracting gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405

go.mod の内容を確認してみます。

$ cat go.mod
module example.com/go-mod-test

go 1.12

require github.com/aws/aws-lambda-go v1.13.2

先程インストールした golang/glog が使われていないので、その情報が削除されている状態になっています。

以上、Modules を使う流れでした。

参考

Modules
https://github.com/golang/go/wiki/Modules

Go & Versioning
https://research.swtch.com/vgo

Using Go Modules
https://blog.golang.org/using-go-modules

广告
将在 10 秒后关闭
bannerAds