dep を使用した Go の依存関係
この記事の英語版に更新があります。ご覧の翻訳には含まれていない変更点があるかもしれません。
最終更新日 2022年01月26日(水)
This article is a work in progress, or documents a feature that is not yet released to all users. This article is unlisted. Only those with the link can access it.
Table of Contents
このガイドでは、dep を使用して依存関係のベンダー化を管理する Go アプリケーションをデプロイするための Heroku のサポートを最大限に利用する方法の概要について説明します。
dep
は、まだ正式にサポートされていません。問題は、ここで報告する必要があります。このドキュメントは暫定的です。
dep README では、ツールの最も一般的な使用法を扱っています。最も一般的なアクティビティについて以下で説明します。
ビルド設定
dep を使用するコードをプッシュすると、Heroku では、dep によって作成された Gopkg.toml
ファイル内のいくつかのエントリを使用してビルドを設定します。具体的には、以下のエントリです。
metadata.heroku['root-package']
(文字列): Heroku にプッシュしているパッケージのルートパッケージ名。これは、go list -e .
を使用してローカルに見つけることができます。デフォルト値はないため、値を指定する必要があります。metadata.heroku['go-version']
(文字列): コードのコンパイル時に Heroku で使用する Go のメジャーバージョン。指定されていない場合は、デフォルトで Go のサポートされている最新バージョンになります。metadata.heroku['install']
(文字列の配列): インストールするパッケージの一覧。指定しない場合、デフォルトは["."]
です。その他の一般的な選択肢には、["./cmd/..."]
(cmd
ディレクトリ内のすべてのパッケージと サブパッケージ) および["./..."]
(現在のディレクトリのすべてのパッケージとサブパッケージ) があります。ただし、正確な選択はリポジトリのレイアウトによって異なります。 Go の 1.9 未満のバージョンの場合、./...
にはvendor
ディレクトリ内のすべてのパッケージが含まれることに注意してください。metadata.heroku['ensure']
(文字列): これがfalse
に設定されていると、dep ensure
は実行されません。metadata.heroku['additional-tools']
(文字列の配列): ユーザーがインストールしようとしていることを buildpack が認識している追加のツールの一覧。ツールに複数のバージョンがある場合は、ツールのその特定のバージョンを選択するために、オプションの@<version>
サフィックスを指定できます。それ以外の場合は、buildpack のデフォルトバージョンが選択されます。現在、サポートされている唯一のツールはv3.0.0
(これもデフォルトバージョン) のgithub.com/mattes/migrate
です。
次に示すのは、プロジェクトでのこれらのフィールドの例です。このプロジェクトでは、ローカルマシンの $GOPATH/src/github.com/heroku/go-getting-started
にある go1.8.3
を使用し、インストールする単一のパッケージ仕様として ./...
を要求します。
[metadata.heroku]
root-package = "github.com/heroku/go-getting-started"
go-version = "1.8.3"
install = [ "./..." ]
...
テキストエディタを使用して Gopkg.toml
ファイルを編集して、少なくとも metadata.heroku['root-package']
エントリを設定する必要があります。
無視された vendor/
サブディレクトリ
Heroku では、dep が検出されるたびに、dep ensure
を実行してから go install
を実行します。この目的は、Gopkg.lock
で指定されたすべての依存関係が、アプリケーションの vendor/
ディレクトリに確実にインストールされるようにすることです。これにより、vendor/
の内容をチェックインしなくても済みます。
vendor/
の内容をチェックインした場合は、その vendor/
の内容のハッシュが Gopkg.lock
からの inputs-digest
に一致すると、dep ensure
は事実上ノーオペレーションになります。
dep をインストールまたは更新する
dep の設定手順を参照してください。
はじめに
dep init
git diff
およびgit status
で変更を検査します。_vendor-<TIMESTAMP>
に名前が変更された古いベンダーフォルダーのバックアップを削除したい場合があります。ただし、これを事前に確認すると役立つことがあります。git add -A vendor Gopkg.toml Gopkg.lock; git commit -am "Switch to Dep"
で変更をコミットします。
依存関係の追加
dep ensure -add <package name>
- 新しい依存関係を使用するようにコードを編集して保存します。
git diff
(または同様のコマンド) で変更を検査します。git add -A vendor Gopkg.toml Gopkg.lock; git commit -am "Add dependency <package>"
で変更をコミットします。
依存関係のバージョン、ブランチ、またはリビジョンを変更する必要がある場合は、Gopkg.toml
に追加されたエントリを変更し、dep ensure
を実行する必要があります。Gopkg.toml
ファイルの詳細は、ここで見つけることができます。
依存関係ステータス
$ dep status
PROJECT CONSTRAINT VERSION REVISION LATEST PKGS USED
github.com/gin-contrib/sse * branch master 22d885f 22d885f 1
github.com/gin-gonic/gin ^1.2.0 v1.2 d459835 d459835 3
github.com/golang/protobuf * branch master 130e6b0 130e6b0 1
github.com/mattn/go-isatty * v0.0.2 fc9e8d8 0360b2a 1
github.com/ugorji/go * branch master 54210f4 54210f4 1
golang.org/x/sys * branch master 429f518 314a259 1
gopkg.in/go-playground/validator.v8 * v8.18.2 5f1438d 5f1438d 1
gopkg.in/yaml.v2 * branch v2 eb3733d eb3733d 1```
これは、現在のプロジェクトで使用中の各種パッケージを示しています。status コマンドの完全な説明については `dep status --help` の出力を参照してください。
## 既存の制約内での既存の依存関係の更新。
1. `dep ensure -update <package>`
1. `git diff` (または同様のコマンド) で変更を検査します。
1. `git add -A vendor Gopkg.toml Gopkg.lock; git commit -m "Update <dependency>"` で変更をコミットします。
## 使用されていない依存関係の削除
1. コードからインポートとすべての使用法を削除します。
1. `Gopkg.toml` からすべての `[[constraint]]` ルールを削除します。
1. `dep ensure` を実行します。
1. `git add -A vendor Gopkg.toml Gopkg.lock; git commit -m "Remove unused dependency <dep>"` で変更をコミットします。