Go 1.11 のリリースと「モジュール」機能の実験的サポート
1ヶ月も前の話で申し訳ないが,先月末に Go 言語コンパイラ 1.11 がリリースされた。
主な変更点は以下の2つ。
- WebAssembly へのコンパイルをサポート
- 「モジュール」機能の実験的サポート
このうち,今回は「モジュール」機能のサポートについて簡単に紹介する。
「モジュール」とは,これまで vgo (Versioned Go) として開発が進められてきたもので
この成果が正式に組み込まれる。
バージョン 1.11 で「モジュール」機能を有効にするには環境変数 GO111MODULE
を on
または auto
にセットする。
ちなみに,環境変数 GO111MODULE
を auto
にセットした場合, GOPATH 下のコードについては以前と同じように動作するが,それ以外の場所では「モジュール」機能が有効になる。
1.11 では環境変数 GO111MODULE
が既定で auto になっている。
試しに以下のソースファイル hello.go
を適当なフォルダに作成する。
package main
import (
"fmt"
"rsc.io/quote"
)
func main() {
fmt.Println(quote.Hello())
}
これを実行しても rsc.io/quote
パッケージがないと怒られてコンパイルエラーになる。
ここまでは従来どおりの動作。
次に以下のコマンドを実行する。
$ go mod init hello
go: creating new go.mod: module hello
このコマンドで go.mod
ファイルが生成される。
中身は以下の通り。
module hello
これで hello.go
ファイルはモジュール hello
のコードとして定義された。
モジュール名はパッケージのインポート・パスと同じくリポジトリのパスと連動している。
たとえば hello.go
ファイルをリポジトリ https://github.com/spiegel-im-spiegel/hello
で公開・管理するなら,モジュール名も github.com/spiegel-im-spiegel/hello
となる。
では,この状態でコードを実行してみよう。
$ go run hello.go
go: finding rsc.io/quote v1.5.2
go: downloading rsc.io/quote v1.5.2
go: finding rsc.io/sampler v1.3.0
go: finding golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c
go: downloading rsc.io/sampler v1.3.0
go: downloading golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c
Hello, world.
自動的に rsc.io/quote
およびその依存パッケージがモジュールとして読み込まれていることが分かると思う。
このとき go.mod
ファイルを見ると
module hello
require rsc.io/quote v1.5.2
依存モジュールおよびそのバージョンの記述が追加されていることが分かる。 モジュール間の依存関係を見るには以下のコマンドを実行する1。
$ go mod graph
hello rsc.io/quote@v1.5.2
rsc.io/quote@v1.5.2 rsc.io/sampler@v1.3.0
rsc.io/sampler@v1.3.0 golang.org/x/text@v0.0.0-20170915032832-14c0d48ead0c
ちなみに,読み込まれたモジュールの実体は $GOPATH/mod
フォルダ以下に格納されている。
更に go.mod
ファイルを以下のように書き換えてみよう。
module hello
require (
golang.org/x/text v0.3.0
rsc.io/quote v1.5.2
)
この状態で,再び実行してみる。
$ go run hello.go
go: finding golang.org/x/text v0.3.0
go: downloading golang.org/x/text v0.3.0
Hello, world.
golang.org/x/text
モジュールの v0.3.0 が読み込まれていることが分かる。
既存のパッケージをモジュールとして定義する際, dep で管理していると移行がスムーズになる。 自作の gpgpdump で試してみよう。
まずはリポジトリの内容を適当なフォルダに展開し go.mod
ファイルを作成する。
$ go mod init github.com/spiegel-im-spiegel/gpgpdump
go: creating new go.mod: module github.com/spiegel-im-spiegel/gpgpdump
go: copying requirements from Gopkg.lock
依存情報を dep の Gopkg.lock
ファイルから取得しているのが分かるだろう。
生成された go.mod
ファイルの内容は以下の通り。
module github.com/spiegel-im-spiegel/gpgpdump
require (
github.com/BurntSushi/toml v0.3.0
github.com/inconshreveable/mousetrap v1.0.0
github.com/pkg/errors v0.8.0
github.com/spf13/cobra v0.0.3
github.com/spf13/pflag v1.0.2
github.com/spiegel-im-spiegel/gocli v0.8.0
golang.org/x/crypto v0.0.0-20180816225734-aabede6cba87
)
新しいバージョンがリリースされていないか調べる場合は以下のコマンドを実行する。
$ go list -m -u all
go: finding github.com/pkg/errors v0.8.0
go: finding github.com/spf13/pflag v1.0.2
go: finding github.com/spf13/cobra v0.0.3
go: finding github.com/BurntSushi/toml v0.3.0
go: finding github.com/spiegel-im-spiegel/gocli v0.8.0
go: finding github.com/inconshreveable/mousetrap v1.0.0
go: finding golang.org/x/crypto v0.0.0-20180816225734-aabede6cba87
go: finding golang.org/x/crypto latest
go: finding github.com/BurntSushi/toml v0.3.1
github.com/spiegel-im-spiegel/gpgpdump
github.com/BurntSushi/toml v0.3.0 [v0.3.1]
github.com/inconshreveable/mousetrap v1.0.0
github.com/pkg/errors v0.8.0
github.com/spf13/cobra v0.0.3
github.com/spf13/pflag v1.0.2
github.com/spiegel-im-spiegel/gocli v0.8.0
golang.org/x/crypto v0.0.0-20180816225734-aabede6cba87 [v0.0.0-20180910181607-0e37d006457b]
この情報を元に go.mod
ファイルを書き換えてみる。
module github.com/spiegel-im-spiegel/gpgpdump
require (
github.com/BurntSushi/toml v0.3
github.com/inconshreveable/mousetrap v1.0.0
github.com/pkg/errors v0.8.0
github.com/spf13/cobra v0.0.3
github.com/spf13/pflag v1.0.2
github.com/spiegel-im-spiegel/gocli v0.8.0
golang.org/x/crypto latest
)
これで最新モジュールを取得できる。
$ go mod download
go: finding golang.org/x/crypto latest
取得後の go.mod
ファイルは以下のように書き換えられる。
module github.com/spiegel-im-spiegel/gpgpdump
require (
github.com/BurntSushi/toml v0.3.1
github.com/inconshreveable/mousetrap v1.0.0
github.com/pkg/errors v0.8.0
github.com/spf13/cobra v0.0.3
github.com/spf13/pflag v1.0.2
github.com/spiegel-im-spiegel/gocli v0.8.0
golang.org/x/crypto v0.0.0-20180910181607-0e37d006457b
)
んー。 これで dep からの置き換えができそうかな。 ようやく「GOPATH 汚染問題」が解消されるかねぇ。
【2018-10-04 追記】 Go 1.11.1 がリリース
【2018-11-03 追記】 Go 1.11.2 がリリース
ブックマーク
参考図書
image = “/images/attention/go-logo_blue.png”
-
是非とも dot 言語で出力してほしい。 ↩︎