いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

Goメモ-107 (go getで参照しているパッケージを一括更新)

概要

忘れないうちにメモメモ。。。

プロジェクトで参照しているライブラリが複数ある場合に一括でアップデートしたいときとかがあります。

そんなとき

$ 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のページに書いてありました。

golang.org

上の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関連の本で、いい本って感じたものです。

Go言語による並行処理

Go言語による並行処理

スターティングGo言語 (CodeZine BOOKS)

スターティングGo言語 (CodeZine BOOKS)

  • 作者:松尾 愛賀
  • 発売日: 2016/04/15
  • メディア: 単行本(ソフトカバー)

プログラミング言語Go (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)

プログラミング言語Go (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)


過去の記事については、以下のページからご参照下さい。

  • いろいろ備忘録日記まとめ

devlights.github.io

サンプルコードは、以下の場所で公開しています。

  • いろいろ備忘録日記サンプルソース置き場

github.com

github.com

github.com