6

によってビルドされたバイナリに現在の git リビジョン番号を追加して、どのリビジョンからビルドされgo buildているか./mybinary --revisionを確認したい (通常は、デプロイ後のトラブルシューティング用)。

明らかに、リビジョン番号をソースに入れることはできません。これは、ソースが新しいリビジョンで変更されるためです。

これを行う他の方法があるかどうか疑問に思っていますか?
それとも、これは単に悪い考えだと思いますか? もしそうなら、ビルドされたバイナリとそのソース バージョンとの関係を確立するための推奨される方法は何ですか?
バージョン番号は、分散バージョン管理システムでは良い考えではないようです。

4

5 に答える 5

10

$VERSION に git リビジョンを取得できversion、メイン パッケージに (文字列型) という名前の変数がある場合は、ビルド中に次のように設定できます。

#!/bin/sh
VERSION=`git rev-parse --short HEAD`
go build -ldflags "-X main.version=$VERSION"  myfile.go
于 2013-03-30T11:12:49.667 に答える
2

私はversion.go単一のファイルを作成しvar version string、呼び出しの前にそれを処理し、go build後でそれをリセットします。つまり、go はどのタイプのコード生成もサポートしていないため、これを行うには外部の何かに頼る必要があります。

于 2013-03-30T03:32:16.590 に答える
2

Gitコードでバージョン管理されているすべての変更セットの識別文字列を取得するための最も明白な方法(オプションでこの文字列を表示するタスクはあなたに任せ--revisionます)

于 2013-03-29T23:02:45.803 に答える
2

通常のプロセスではldflags、Go 1.18 (2021 年第 4 四半期/2022 年第 1 四半期) 以降、.

問題 37475およびCL 356013を参照してください

このgoコマンドは、現在チェックアウトされているリビジョンや、編集済みまたは追跡されていないファイルが存在するかどうかを示すフラグなど、バージョン管理情報をバイナリに埋め込むようになりました。

goコマンドが Git または Mercurial リポジトリ内のディレクトリで呼び出され、mainパッケージとそれに含まmainれるモジュールが同じリポジトリにある場合、バージョン管理情報が埋め込まれます。
この情報は、フラグを使用して省略できます-buildvcs=false

さらに、このgoコマンドは以下に関する情報を埋め込みます。

  • ビルドタグとツールタグを含むビルド ( で設定-tags)、
  • コンパイラ、
  • アセンブラ、および
  • リンカー フラグ ( など-gcflags)、
  • 有効になっているかどうかcgo、有効である場合はcgo環境変数の値 ( などCGO_CFLAGS)。

この情報は、フラグを使用して省略できます-buildinfo=false

以下を使用して、VCS とビルド情報の両方をモジュール情報と一緒に読み取ることができます。

CL 373875追加

  • 構造体にはBuildInfo、バイナリがどのように構築されたかに関する追加情報を含む新しいフィールドがあります。
  • 新しいGoVersionフィールドには、バイナリのビルドに使用された Go のバージョンが保持されます。
  • 新しいフィールドは、ビルドを説明するキーと値のペアを保持する構造体Settingsのスライスです。BuildSettings
于 2021-10-18T06:45:43.230 に答える
1

通常、タグ (他のバージョン管理システムではラベルとも呼ばれます) を使用して、特定のビルドを構成するファイルを記録します。 http://git-scm.com/book/en/Git-Basics-Tagging . 私は通常、バージョンとビルド日を含むタグを作成します。たとえば、v1.2_29Mar2013。同じコード ベースから構築できる製品が複数ある場合は、どの製品かを識別するための情報を含めます。

于 2013-03-29T21:57:46.287 に答える