前回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 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。