モジュールをサポートするgo 1.11を使用しています。 goツールはビルド/インストール時に依存関係を自動的にインストールすることを理解しています。私もその理由を理解しています。
Dockerを使用してバイナリをビルドしています。他の多くのエコシステムでは、依存関係マニフェスト(package.json、requirements.txtなど)をコピーし、ビルドとは別の段階として依存関係をインストールするのが一般的です。これは、Dockerのレイヤーキャッシングを利用し、一般的にコードの変更が依存関係の変更よりもはるかに多いため、再構築をはるかに高速化します。
Vgoにこれを行う方法があるかどうか疑問に思っていましたか?
これは問題でした #2661 。これは現在修正されています。
したがって、次のように使用できます。
go mod download
これが機能するためには、go.mod
/go.sum
ファイル。
たとえば、キャッシュされたマルチステージDockerビルドを作成する方法は次のとおりです。
FROM golang:1.12-Alpine as builder
RUN apk --no-cache add ca-certificates git
WORKDIR /build/myapp
# Fetch dependencies
COPY go.mod ./
RUN go mod download
# Build
COPY . ./
RUN CGO_ENABLED=0 go build
# Create final image
FROM Alpine
WORKDIR /root
COPY --from=builder /build/myapp/myapp .
EXPOSE 8080
CMD ["./myapp"]
メインモジュールのルートフォルダーにvendor
フォルダーを作成し、すべての依存関係をそこにコピーする_go mod vendor
_コマンドを使用できます。この後、_-mod=vendor
_ paramをgoツールに渡すと、vendor
フォルダーからの依存関係を使用してアプリをビルド/コンパイル/テストできます。
ビルドを高速化するためにあなたができること:
go mod vendor
_コマンドを実行して、依存関係の実際のバージョンを取得します。vendor
フォルダーを保存/キャッシュします。vendor
フォルダーを復元し、goツールに_-mod=vendor
_引数を渡すことでアプリをビルド/インストールします。したがって、依存関係はダウンロードされませんが、vendor
フォルダーのコンテンツが使用されます。_go help mod
_からの引用:
モジュールとベンダー
モジュールを使用する場合、goコマンドはベンダーディレクトリを完全に無視します。
デフォルトでは、goコマンドは、ソースからモジュールをダウンロードし、ダウンロードしたコピーを使用して(前のセクションで説明した検証後)依存関係を満たします。 Goの古いバージョンとの相互運用を可能にするため、またはビルドに使用されるすべてのファイルが単一のファイルツリーに一緒に保存されるように、「go mod vendor」はメインモジュールのルートディレクトリにvendorという名前のディレクトリを作成し、そこにすべて保存しますメインモジュール内のパッケージのビルドとテストをサポートするために必要な依存モジュールからのパッケージ。
メインモジュールの最上位ベンダーディレクトリを使用してビルドし、依存関係を満たす(通常のネットワークソースとローカルキャッシュの使用を無効にする)には、「go build -mod = vendor」を使用します。メインモジュールの最上位ベンダーディレクトリのみが使用されることに注意してください。他の場所のベンダーディレクトリは引き続き無視されます。
パッケージマネージャを使用できます。 dep 、 glide 、および govendor など、それらの多くがあります。 dep
はより新しく、公式の依存関係管理ツールとしてgoツールチェーンに統合される予定です。
また、goアプリケーションのdockerイメージを作成し、 dind を使用してそれらのイメージを作成し、ビルドを高速化するためにすべての依存関係が事前にインストールされたCI/CDイメージを準備しました。ただし、すべてをつなぎ合わせるには、少しのスクリプトが必要でした。
さらに、依存関係を階層化すると、Dockerイメージのサイズが大きくなる可能性があります。 multi-stage builds を試してみることをお勧めします。これにより、画像をスーパーライトにすることができます。