Mazn.net

やってみて 調べてみて 苦労しなけりゃ 箱は動かじ

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!

 - IT技術, プログラミング

336px

Message

メールアドレスが公開されることはありません。

  関連記事

no image
ログファイル監視 + イベントスクリプト@ruby

ログファイルを監視して、ある文字列が出力されたらイベントを発生させたかったので、 …

no image
LVM覚え書き@Fedora14

LVMの使い方をすぐ忘れてしまうので、覚え書き。 LVM用のパーティションを用意 …

no image
ApacheのNameVirtualHostのデフォルトサイト設定(含SSL)@CentOS 5

CentOS 5 のApacheで、名前ベースのバーチャルホストを構築してみた。 …

no image
Windows 7 ファイルサーバにアクセスできない@Windows 7 Ultimate

Windows 7 をファイルサーバにしているのですが、ファイルアクセスが高負荷 …

no image
キル(コピー)した文字列の履歴をさかのぼってヤンク(貼り付け)する@bash

bashで、Ctrl-kでキル(コピー)した文字列をCtrl-yでヤンク(貼り付 …

no image
Cygwinでscreenコマンドが使えなくなる@Windows 10

Windows 10 上のCygwin (64bit版使用)で、screen コ …

no image
Amazonのタイムアウト

Amazon へアクセスすると、過去に利用したことがあると”こんにちは○○さん” …

no image
nslookupでホスト名引けるのにpingに失敗する@Windows

自前のDNSサーバをたてて、ホストを登録してWindowsから登録したホストにp …

no image
光学メディアの書き込み速度

DVDドライブやBlu-rayドライブを買うとき、CD-R 4倍速書き込み、DV …

no image
Galaxy SでGPS制度が悪い@b-mobile U300

※いろいろやった結果のまとめは一番下です。 Galaxy Sを手に入れたので、b …