govendor による Go の依存関係の管理
この記事の英語版に更新があります。ご覧の翻訳には含まれていない変更点があるかもしれません。
最終更新日 2022年01月26日(水)
このガイドでは、Heroku のサポートを最大限に利用して Go アプリケーションをデプロイし、govendor を使用して依存関係のベンダー化を管理する方法について説明します。
govendor FAQ では、ツールの最も一般的な使用法を扱っています。最も一般的なアクティビティについて以下で説明します。
ビルド設定
govendor を使用するコードをプッシュすると、Heroku は govendor によって作成された vendor/vendor.json
ファイル内の複数のエントリを使用してビルドを設定します。具体的には、以下のエントリです。
rootPath
(文字列): Heroku にプッシュしているパッケージのルートパッケージ名。ローカルでは、go list -e .
を使用してこれを確認できます。デフォルト値はないため、値を指定する必要があります。govendor の最近のバージョンでは、このフィールドは自動で入力されます。アップグレード後にgovendor init
を再実行すると、このフィールドに自動で入力できます。あるいは、このフィールドは、次に govendor を使用して依存関係を変更するときに入力されます。heroku.goVersion
(文字列): コードのコンパイル時に Heroku で使用する Go のメジャーバージョン。指定しない場合、Heroku はデフォルトで Go のサポートされている最新バージョンを使用します。heroku.install
(文字列の配列): Heroku でインストールするパッケージのリスト。指定しない場合、デフォルトは["."]
です。その他の一般的な選択肢には、["./cmd/..."]
(cmd
ディレクトリ内のすべてのパッケージとサブパッケージ) および["./..."]
(カレントディレクトリのすべてのパッケージとサブパッケージ) があります。正確な選択は、リポジトリのレイアウトによって異なります。./...
はvendor
ディレクトリ内のすべてのパッケージを含めることに注意してください。heroku.sync
(ブール値): デフォルトでは、Heroku はgovendor sync
を実行して、ベンダーのコンテンツがvendor.json
で指定されたものであることを確認します。場合によっては、これを行わない理由があります。heroku.sync
をfalse
に設定すると、govendor sync
が無効になります。
次に示すのは、プロジェクトでのこれらのフィールドの例です。このプロジェクトでは、ローカルマシンの $GOPATH/src/github.com/heroku/go-getting-started
にある go1.6
を使用し、インストールする単一のパッケージ仕様として ./...
を要求します。
{
...
"rootPath": "github.com/heroku/go-getting-started",
"heroku": {
"install" : [ "./..." ],
"goVersion": "go1.6"
},
...
}
heroku.install
エントリまたは heroku.goVersion
エントリを設定する必要がある場合、テキストエディタまたは jq
などのツールを使用して vendor/vendor.json
ファイルを編集する必要があります。
無視された vendor/
サブディレクトリ
govendor FAQ で指定されているように、vendor/*/
を .gitignore
ファイルに追加し、ベンダー化コードを Git への取り込みから除外することができます。
Heroku では、govendor が検出されるたびに、go install
を実行する前に govendor sync
を実行します。この目的は、vendor.json
で指定されたすべての依存関係が、アプリケーションの vendor/
ディレクトリに確実にインストールされるようにすることです。
govendor をインストールまたは更新する
$ go get -u github.com/kardianos/govendor
このコマンドは、ツールを含むパッケージをダウンロードまたは更新し、ソースコードを $GOPATH/src/github.com/kardianos/govendor
に配置してから、パッケージをコンパイルし、govendor
バイナリを $GOPATh/bin
に配置します。
はじめに
govendor init
git diff
(または同様のコマンド) で変更を検査します。git add -A vendor; git commit -am "Setup Vendor"
で変更をコミットします。
これにより vendor/
ディレクトリが作成され、そのディレクトリ内に vendor.json
ファイルが作成されます。
依存関係の追加
govendor fetch <package>
git diff
(または同様のコマンド) で変更を検査します。git add -A vendor; git commit -am "Add dependency <package>"
で変更をコミットします。
govendor に渡されるパッケージ仕様には、vendor/
にインストールするパッケージの特定のリビジョンのタグまたはコミット SHA で構成されるバージョン仕様を含めることもできます。たとえば、パッケージ github.com/Sirupsen/logrus
の v0.9.0
をインストールする場合は、govendor fetch github.com/Sirupsen/logrus@v0.9.0
を実行します。バージョン仕様が指定されていない場合、最新のコミットが使用されます。
依存関係ステータス
$ govendor list
v github.com/gin-gonic/gin
v github.com/gin-gonic/gin/binding
v github.com/gin-gonic/gin/render
v github.com/manucorporat/sse
v github.com/mattn/go-colorable
v github.com/mattn/go-isatty
v golang.org/x/net/context
v gopkg.in/bluesuncorp/validator.v5
pl github.com/heroku/go-getting-started/cmd/go-getting-started
これは、現在のプロジェクトで使用中の各種パッケージを示しています。各文字の意味については、govendor -h
の Status Types
セクションに詳しい説明があります。
既存の依存関係の更新
govendor fetch <package>@<version>
git diff
(または同様のコマンド) で変更を検査します。git add -A vendor; git commit -m "Update <dependency>"
で変更をコミットします。
新しい依存関係の追加時と同様、fetch を使用して既存の依存関係をフェッチし、vendor/vendor.json
に更新を記録することによってその依存関係を更新できます。
使用されていない依存関係の削除
govendor remove +u
git diff
(または同様のコマンド) で変更を検査します。git add -A vendor; git commit -m "Remove unused dependencies"
で変更をコミットします。
これにより、使用されていない依存関係がすべて削除されます。最初に govendor list +u
の出力をチェックして、govendor が未使用と認識しているものを確認できます。