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 tidy
や go test all
をやるべしとあるが、何もやっていない。(ひょっとしたらVS Codeプラグインの機能で go mod tidy
は掛かっているのかもしれない)
やったことは、タグを付けてGitHubにpushし、goreleaserを使ってバイナリをリリースしただけ。
これだけで pkg.go.dev にインデックスされるようだ。
NOTE:
- semverじゃないと駄目、みたいな仕様はあるのかも?
メモ:
- goreleaserについてはGolang > エコシステム > goreleaserに書いた。