GO言語1.12の新機能モジュールを使う
2019/02/05
GO 1.12から、公式にmoduleが使えるようになるようなので、一足先に1.12beta2を使って試してみました。
modulesは、go getやglide, depといったGOのパッケージ管理コマンドの代わりとなる公式機能で、1.11まではvgoというコマンドが公式に提供されていましたが、これがgoコマンドにマージされたものになります。
※ vgoの開発リポジトリは2019/3頃(1.12リリース後約1ヶ月)で削除されるようです
ドキュメントは、go helpで見れます。
$ go help modules
moduleの動作は、プロジェクトのトップディレクトリのgo.modというファイルで定義され、この設定ファイルのドキュメントも同様にgo helpで見れます。
$ go help go.mod
試しに適当にディレクトリを作って以下のファイル(modtest.go)を作成します。
このファイルでは、外部パッケージrsc.io/quoteを必要としているのがわかると思います。
※プロジェクトのディクレクトリの場所はGOPATH配下の必要はありません。
package main
import (
"fmt"
"rsc.io/quote"
)
func main() {
fmt.Println(quote.Hello())
}
単純にgo runを実行すると当然パッケージがないので怒られます。
$ go run modtest.go
modtest.go:5:5: cannot find package "rsc.io/quote" in any of:
/home/user/sdk/go1.12beta2/src/rsc.io/quote (from $GOROOT)
/home/user/go/src/rsc.io/quote (from $GOPATH)
module機能を使うために、go.modファイルを以下のコマンドで作成します。
$ go mod init modtest.go
go: creating new go.mod: module modtest.go
以下のファイルが作成されました。
$ cat go.mod
module modtest.go
go 1.12
この状態で、再度go runすると、ソース内でimportされたパッケージが自動でダンロードされ、以下のように実行結果が表示されます。
$ go run modtest.go
go: finding rsc.io/quote v1.5.2
go: downloading rsc.io/quote v1.5.2
go: extracting rsc.io/quote v1.5.2
go: finding rsc.io/sampler v1.3.0
~省略~
Ahoy, world!
実行後、go.modは以下に変更されていました。
$ cat go.mod
module modtest.go
go 1.12
require rsc.io/quote v1.5.2 // indirect
今回はrsc.io/quoteだけをimportした単純な例なのでよいのですが、場合によってはダウンロードされたパッケージのバージョンが想定しているバージョンと異なりビルドできなかったり、アプリが動かなかったりします。そのような場合は、require でバージョンを指定してあげましょう。
$ cat go.mod
module modtest.go
go 1.12
require rsc.io/quote v1.5.1 // indirect
パッケージが多段にimportされていると、自分で指定したバージョンが勝手に書き換わってしまうこともあります(よく理解してない・・)。そのようなときは、replcaseを書いておくとバージョンを固定できるようです。今回は、1.5.2を1.5.0に書き換えてみました。
module modtest.go
go 1.12
require rsc.io/quote v1.5.2 // indirect
replace rsc.io/quote v1.5.2 => rsc.io/quote v1.5.0
実行すると、以下のように新たに1.5.0がダウンロードされ、実行結果が表示されました。
$ go run modtest.go
go: finding rsc.io/quote v1.5.0
go: downloading rsc.io/quote v1.5.0
go: extracting rsc.io/quote v1.5.0
Ahoy, world!
336px
関連記事
-
-
chromeに独自のproxyを設定
Windows版のchromeのproxyの設定を開くと、システム(IE)のpr …
-
-
iptablesでポートフォワーディング
通常Linuxのデフォルトはパケットのフォワーディングが無効になっているので、ま …
-
-
Galaxy S + PdaNet でBluetoothテザリング
※本記事の方法でいかなる損害が発生したとしても、責任は負いません。 Galaxy …
-
-
EntityBean @ JBoss 4.2
JBoss 4.2でEntityBeanを作ってみた。 @Idアノテーションは書 …
-
-
minttyの色変更を変更する@Cygwin 1.7
最近、Cygwin 1.7でコンソールにminttyを使用してます。 このmin …
-
-
lsの色を変更する@Cygwin
lsコマンドは、ディレクトリやファイルの種類によって、表示に色をつけることができ …
-
-
aufsでディレクトリを重ねてマウント@Ubuntu 14.04
aufsをUbuntu 14.04上で使ってみました。 aufsは、複数のディレ …
-
-
pythonのpipをインストール@cygwin
cygwinのsetuptoolsがインストールされていない場合は、インストール …
-
-
Portable Ubuntu for Windows
Portable Ubuntu for Windowsなるものがあるらしいです。 …
-
-
設定とメールを任意のフォルダに移動@Thunderbird 2
長年使っていたBeckyからThunderbirdに移行を始めました。 Beck …