go getのv flagやu flagなどについてまとめた

thumnail
2020-07-23

背景

GoでREADMEを読んでパッケージをインストールするときに深く考えずにgo getを叩いてパッケージをダウンロードしていた。ふとある時、-u-vなどのflagを付与する/付与しないによってどのように挙動が変わるのかが気になったので調べてみることにした。その結果をこの記事に備忘録としてまとめておく。

go getとは何か

パッケージをダウンロードする

大前提go getはGoのパッケージをダウンロードするために使うコマンドだ。

go get -u github.com/mailru/easyjson/...

パスを指定して、そこに定義されている依存関係を含めたパッケージをダウンロードする。

Get downloads the packages named by the import paths, along with their dependencies. It then installs the named packages, like 'go install'.

参考文献:「Package get」

https://golang.org/pkg/cmd/go/internal/get/

go getとgo installの違い

got getはgo installを内包する

上の英語の説明でgo getgo installのようなものだと書かれていた。それぞれの違いがいまいちわからないので調べてみると、stack overflowに次のように書かれていた。

go get does two main things in this order: downloads and saves in $GOPATH/src/ the packages (source code) named in the import paths, along with their dependencies, then executes a go install

参考文献:「What is the difference between go get and go install?」

https://stackoverflow.com/questions/24878737/what-is-the-difference-between-go-get-and-go-install

go getはパッケージをダウンロードしてきた後に、go installを実行する。go installはパッケージをbuildしてバイナリに変換し/binに配置するコマンドだ。つまりgo getを実行するとパッケージをダウンロードして、バイナリに変換するという動作をしてくれるのだ。

v flagとは何か

ダウンロード中の情報を詳細に表示する

このflagを付与するとパッケージをダウンロードしているときに詳細な進捗情報とデバック出力が標準出力として表示されるようになる。Dockerfileをbuildしてデプロイする場合などDockerfileにgo getを記述する場合はv flagを付与すると良さそう。

The -v flag enables verbose progress and debug output.

参考文献:「Package get」

https://golang.org/pkg/cmd/go/internal/get/

d flagとは何か

パッケージをダウンロードした後バイナリに変換しない

上でgo getを実行した後はgo installが実行されると話したが、このd flagを付与した場合、go installが実行されない。つまりバイナリファイルが生成されない。

The -d flag instructs get to stop after downloading the packages; that is, it instructs get not to install the packages.

参考文献:「Package get」

https://golang.org/pkg/cmd/go/internal/get/

u flagとは何か

依存関係のパッケージをversion upさせる

easyjsonというパッケージを次のコマンドでダウンロードしたとする。

go get -u github.com/mailru/easyjson/...

このときeasyjsonを使用している別のパッケージBが存在した場合、このパッケージBがminor, patchのversionが上がっていた場合、このパッケージBのversionをupdateする。少し話が複雑になってしまって申し訳ないが、さらにパッケージBがパッケージCを使用している場合、パッケージCがパッケージAで使われていれば同じようにパッケージCに対してもversion upを実施する。しかしパッケージAで使われていない場合はversion upは実施しない。

The -u flag instructs get to update modules providing dependencies of packages named on the command line to use newer minor or patch releases when available. Continuing the previous example, 'go get -u A' will use the latest A with B v1.3.1 (not B v1.2.3). If B requires module C, but C does not provide any packages needed to build packages in A (not including tests), then C will not be updated.

参考文献:「Package get」

https://golang.org/pkg/cmd/go/internal/get/

profile

KATUO

web developer

六本木で月間利用者数数千万のサービスを運営するミドルベンチャーでWeb系エンジニアをやってます。フロントエンドはVue.js/Nuxt.js,サーバーサイドはGolang, クラウドはAWS, GCPを良く扱います。お仕事・イベント等の依頼はContactのフォームからお願いします。

KATUBLO

Copyright since 2018 KATUO All Rights Reserved.