概要
忘れないうちにメモメモ。。。
プロジェクトで参照しているライブラリが複数ある場合に一括でアップデートしたいときとかがあります。
そんなとき
$ go get -u go get .: path /home/devlights/dev/try-golang is not a package in module rooted at /home/devlights/dev/try-golang
ってエラーがでて、はぁ?ってなることがたまにありますw
go get
さんは、パッケージを指定しない場合はカレントディレクトリを対象にして更新をしようとするので
たとえば、以下のように cmd ディレクトリの下に main パッケージがあったりすると上のエラーが出ます。
$ tree -L 1 . ├── Dockerfile ├── LICENSE ├── Makefile ├── README.md ├── books ├── builder ├── cmd # <-- main パッケージはこの下にある ├── effectivego ├── examples ├── go.mod ├── go.sum ├── mappings └── tutorial
で、main パッケージがある場所まで移動して
$ cd cmd/trygolang $ go get -u go: golang.org/x/text upgrade => v0.3.3 go: golang.org/x/crypto upgrade => v0.0.0-20200820211705-5c72a883971a go: golang.org/x/sync upgrade => v0.0.0-20200625203802-6e8e738ad208 go: golang.org/x/sys upgrade => v0.0.0-20200918174421-af09f7315aff go: golang.org/x/xerrors upgrade => v0.0.0-20200804184101-5ec99f83aff1 go: github.com/google/go-cmp upgrade => v0.5.2
ってやると、ちゃんと動いてくれるのですが、これがめんどくさい。。
んで、なんかやり方ないかなーって毎回調べるのですが
$ go help get
とかしても、特にそのような記載はないんですよね。。。
一個一個アップデートしていくのがいいのかもしれませんが面倒なときも多いです。
情報を探す
ちょっと、探してみたら、ちゃんとGoのページに書いてありました。
上のGo本家ブログ記事の go get
のところに以下のように記載されています。
Note in particular that go get -u (without additional arguments) now updates only the transitive imports of the package in the current directory. To instead update all of the packages transitively imported by the main module (including test dependencies), use go get -u all.
mainモジュールによってインポートされているパッケージを全部アップデートしたかったら
$ go get -u all
ってしろって書いてありますね。
試してみる
直下に main パッケージがある場合
以下のような構成とします。
$ tree -L 1 . ├── go.mod ├── go.sum └── main.go
この状態で、一旦バージョンがひとつ古い版のパッケージをわざと go get .
# 以下のパッケージのlatestは v0.2.9 $ go get github.com/devlights/gomy@v0.2.8
go.mod は以下のようになっています。
module gogettest1 go 1.15 require github.com/devlights/gomy v0.2.8
で、パッケージの更新を叩いてみる
$ go get -u go: github.com/devlights/gomy upgrade => v0.2.9
カレントディレクトリに パッケージがあるのでちゃんと更新されました。
では、次に go get -u all
も試してみます。やる前にパッケージが更新されちゃっているので戻してから以下を実行。
$ go get -u all go: github.com/devlights/gomy upgrade => v0.2.9
ちゃんと更新されましたね。
main パッケージがカレントディレクトリに無いパターン
以下のような構成とします。
tree . ├── cmd │ └── gogettest │ └── main.go ├── go.mod └── go.sum
この状態で、一旦バージョンがひとつ古い版のパッケージをわざと go get .
# 以下のパッケージのlatestは v0.2.9 $ go get github.com/devlights/gomy@v0.2.8
go.mod は以下のようになっています。
module gogettest2 go 1.15 require github.com/devlights/gomy v0.2.8
で、パッケージの更新を叩いてみる
$ go get -u go get .: path /home/devlights/tmp/gogettest2 is not a package in module rooted at /home/devlights/tmp/gogettest2
カレントディレクトリには 何のパッケージも無いのでエラーになりましたね。
次に go get -u all
を叩いてみます。
$ go get -u all go: github.com/devlights/gomy upgrade => v0.2.9
ちゃんと更新されましたね。
おすすめ書籍
自分が読んだGo関連の本で、いい本って感じたものです。
- 作者:Katherine Cox-Buday
- 発売日: 2018/10/26
- メディア: 単行本(ソフトカバー)
- 作者:松尾 愛賀
- 発売日: 2016/04/15
- メディア: 単行本(ソフトカバー)
プログラミング言語Go (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)
- 作者:Alan A.A. Donovan,Brian W. Kernighan
- 発売日: 2016/06/20
- メディア: 単行本(ソフトカバー)
過去の記事については、以下のページからご参照下さい。
- いろいろ備忘録日記まとめ
サンプルコードは、以下の場所で公開しています。
- いろいろ備忘録日記サンプルソース置き場