Go 1.11 のリリースと「モジュール」機能の実験的サポート

no extension

1ヶ月も前の話で申し訳ないが,先月末に Go 言語コンパイラ 1.11 がリリースされた。

主な変更点は以下の2つ。

  • WebAssembly へのコンパイルをサポート
  • 「モジュール」機能の実験的サポート

このうち,今回は「モジュール」機能のサポートについて簡単に紹介する。

「モジュール」とは,これまで vgo (Versioned Go) として開発が進められてきたもので

この成果が正式に組み込まれる。 バージョン 1.11 で「モジュール」機能を有効にするには環境変数 GO111MODULEon または auto にセットする。

ちなみに,環境変数 GO111MODULEauto にセットした場合, 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

依存情報を depGopkg.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 がリリース

“go1.11.1 (released 2018/10/01) includes fixes to the compiler, documentation, go command, runtime, and the crypto/x509, encoding/json, go/types, net, net/http, and reflect packages. See the Go 1.11.1 milestone on our issue tracker for details.”

【2018-11-03 追記】 Go 1.11.2 がリリース

“go1.11.2 (released 2018/11/02) includes fixes to the compiler, linker, documentation, go command, and the database/sql and go/types packages. See the Go 1.11.2 milestone on our issue tracker for details.”

ブックマーク

参考図書

image = “/images/attention/go-logo_blue.png”


  1. 是非とも dot 言語で出力してほしい。 ↩︎