前回golangのpackageのことを調べていたが、github.comなどのpackageについて調べ忘れていた。
例題として何かgit関係のリポジトリから取ってこよう。
ログ出力だったら、難しくないんじゃなかろうか。
local/helloworld/hel/main.go
01: package main 02: 03: import "log" 04: import "os" 05: import "local/helloworld/hel/makkey" 06: import "github.com/hashicorp/logutils" 07: 08: func main() { 09: filter := &logutils.LevelFilter{ 10: Levels: []logutils.LogLevel{"DEBUG", "WARN", "ERROR"}, 11: MinLevel: logutils.LogLevel("WARN"), 12: Writer: os.Stderr, 13: } 14: log.SetOutput(filter) 15: log.Print("[WARN]Hello, World!\n") 16: makkey.Callme(filter) 17: }
local/helloworld/hel/makkey/masao.go
01: package makkey 02: 03: import "log" 04: import "github.com/hashicorp/logutils" 05: 06: //Callme masao 07: func Callme(filter *logutils.LevelFilter) { 08: log.Print("[ERROR]I'm masao!\n") 09: }
$ go get -d -u github.com/hashicorp/logutils
$ go run local/helloworld/hel
2019/11/16 23:28:51 [WARN]Hello, World!
2019/11/16 23:28:51 [ERROR]I'm masao!
例を見ながら、なんとなく動かせた。
go getでライブラリをダウンロードしたりインストールしたりするのを見ていたので使ってみたのだが、そもそもどうなんだろうか?
他にもglideやらdepやらでインストールすることがあったのだが、そもそもどれが何なのだろうか?
- glideは非推奨になって、depを使ってほしいらしい(glide v0.13.0)
- depはgolang v1.9以上らしい
- go getは依存関係は解決してくれるが、パッケージ管理とは異なりそうな気がする
- vgoという名前も出てくるが、Go Modulesの前身?
- https://syfm.hatenablog.com/entry/2019/08/10/170730
- GO111MODULE=onするとGo Modulesなるものが使えるようだ
- と思ったら、golang v1.13ではgo getしてもGo Modulesっぽい動作をする?
わけが分からんぞ!
たぶん、golang v1.13以降で、リポジトリにgo.modがあるなら、GO111MODULE=onなどしなくてもGo Modulesの動作をするんだろうと思う。
では、Go Modulesの動作とは何かというと、おそらく$GOPATH/pkg/mod/の下に依存するソースファイルをダウンロードすることだ(ビルドもするのだろう)。「go getがGOPATH modeとは異なる動作をする」といってるので、そうなのじゃなかろうか。
私が見たGo Modulesの使い方は、こんなのだった。
$ GO111MODULE=on go install xxx
これでやってるせいか知らないが、pkg/mod/の中に入ってるものはアクセス権があってsudoしないと削除できなかった。
仕事でやろうとしているリポジトリはgo.modがあったし、今はgolang v1.13なのでgo getしてみたものの、pkg/mod/にはダウンロードせず、src/github.com/などにだらだらダウンロードし始めてしまった(途中でプロセスを殺したので、最後までは知らない)。
$ GO111MODULE=on go get -u xxx
とすると、pkg/mod/の下にダウンロードしているようだ。src/の下は何も増えていない。
「golang v1.13でもGO111MODULE=autoがデフォルトなのはそのままで、ただし$GOPATH/src/の中にgo.modがあればmodule-aware modeになる」らしい。
module-aware modeというのが、私が思うGo Modulesっぽい動作なのだろう。そしてGO111MODULE=onすると最初からGo Modulesっぽい動作をするので、$GOPATH/src/にはダウンロードされないんだろう。
なので、golang v1.13でGO111MODULEは未設定のまま、メインのソースファイルを編集したいが依存するパッケージはそのまま使いたいのなら、本体はgit cloneなどで$GOPATH/src/以下に取得し、その中でgo installすればいいはずだ。go.modがあるなら$GOPATH/pkg/mod/以下に取得するし、無かったら$GOPATH/src/に取得するだろう。
私がめんどくさいと思っているのは、$GOPATH/src以下に取得するときなのだ。github.comだったとして、github.com/aaaa/bbbbというリポジトリを取得したいのだったら、
$ mkdir -p $GOPATH/src/github.com/aaaa
$ cd $GOPATH/src/github.com/aaaa
$ git clone https://github.com/aaaa/bbbb
とかしないといかんじゃないか。git cloneで引数を付けてディレクトリを指定してもいいけど、打ち込む文字数はそんなに変わらんし。それがgo getだとディレクトリの作成までやってくれるので使いたかったのだ。
src/local/helloworld/helにはgo.modがないので、go installとかgo getとかすると$GOPATH/src/以下にgithub.com/hashicorpのリポジトリをダウンロードしてくる。
これをsrc/に起きたくなかったら、go.modを書くのが良いだろう。
手動で書かなくても済みそうな気がするが、自動生成はできるのだろうか?
できそうだ。
$ cd $GOPATH/src/local/helloworld/hel
$ go mod init local/helloworld/hel
$ go build
go mod initでgo.modができて、go buildすると更新されてgithub.com/hashicorp/logutilsがバージョン付きで追加されていた。logutilsもsrc/の下ではなく、pkg/mod/の下に取得されていた。
local/helloworld/hel/makkeyの方は書かれていなかったので、パスで見分けているのかもしれん。
0 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。