2020-06-08

6/8

はじめてのGo Module

shelpをGo Module対応して作ったところ、tagをつけてGitHubに公開しただけで pkg.dev.go にもindexされた。

https://pkg.go.dev/mod/github.com/progrhyme/shelp

今のところmodule / packageとしての利用は想定してないけど、それはそれとしてmoduleを作ってリリースするまでの流れをメモしておく。

基本的に、 https://github.com/golang/go/wiki/Modules#how-to-use-modules の流れに従えばよい。

作業環境:

  • Ubuntu 18.04 LTS
  • go v1.14.2

参考:

①コンパイラの用意

Go 1.14以上なら何もしなくていい。
Go 1.11〜1.13の場合、環境変数の設定が必要:

export GO111MODULE=on

②Moduleの初期化

GOPATHの外のディレクトリでモジュールのディレクトリを作る。
私の環境ではGOPATH設定してない。

cd somewhere/shelp
git init
git commit --allow-empty -m "Initial commit"
go mod init github.com/progrhyme/shelp

これによって次のような go.mod ファイルが作られる:

module github.com/progrhyme/shelp

go 1.14

③依存ライブラリの追加

VS Codeでプラグインを入れて作業してたら勝手にgo.mod, go.sumが更新されていったので、あまり意識的に作業はしていない。

shelp v0.1.0 時点では、次のようになった。

$ cat go.mod
module github.com/progrhyme/shelp

go 1.14

require (
        github.com/spf13/pflag v1.0.5
        golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9
)

$ cat go.sum
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9 h1:vEg9joUBmeBcK9iSJftGNf3coIG4HqZElCPehJsfAYM=
golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d h1:+R4KGOnez64A81RvjARKc4UT5/tI9ujCIVX+P5KiHuI=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=

それぞれのファイルは、RubyのbundlerでいうところのGemfileとGemfile.lockに相当すると見ていいのだろう。
npmならpackage.jsonとpackage-lock.json. (以下略)

④リリース

公式手順だと go mod tidygo test all をやるべしとあるが、何もやっていない。(ひょっとしたらVS Codeプラグインの機能で go mod tidy は掛かっているのかもしれない)

やったことは、タグを付けてGitHubにpushし、goreleaserを使ってバイナリをリリースしただけ。

これだけで pkg.go.dev にインデックスされるようだ。

NOTE:

  • semverじゃないと駄目、みたいな仕様はあるのかも?

メモ: