PowerShell で書く、Go言語プログラムのリリース管理的なアレ(3)バージョン文字列の設定

バッチファイルの話もするとたいへんなので、以下 PowerShell だけという方向で:

Go ソースへの埋め込み

これは簡単で、

go build "-o" nyagos.exe -ldflags "$ldflags -X main.version=$version"

だけでよい。これで main パッケージの version という変数に $version の内容が設定される。 Go ソース側で受け皿となる変数の宣言を忘れないように。

var version string

Windows プロパティーへの埋め込み

ちょっとめんどう。goversioninfo というツールを使う。 (make.cmd では Make-SysO という関数内で行っている)

    .\goversioninfo.exe `
        "-file-version=$version" `
        "-product-version=$version" `
        "-icon=mains\nyagos.ico" `
        ("-ver-major=" + $v[0]) `
        ("-ver-minor=" + $v[1]) `
        ("-ver-patch=" + $v[2]) `
        ("-ver-build=" + $v[3]) `
        ("-product-ver-major=" + $v[0]) `
        ("-product-ver-minor=" + $v[1]) `
        ("-product-ver-patch=" + $v[2]) `
        ("-product-ver-build=" + $v[3]) `
        "-o" nyagos.syso `
        versioninfo.json

(PowerShell で逆クォートは、UNIX系のバックスラッシュみたいな役割を担っている)

基本の情報は versioninfo.json に記しておいて、変更がよく発生するところだけ、オプションで変更する。 このコマンドで生成されたnyagos.sysoというファイルを go build するフォルダーにおいておくだけで、 これらの情報が実行ファイルに埋め込まれる。

Windows にはバージョン番号のプロパティーが複数ある。

  • 製品バージョン(product-version)
  • ファイルバージョン(file-version)

NYAGOS では両者は同じ扱いにしているが、大きなパッケージソフトウェアでは、パッケージ全体のバージョンを product-version とし、個別ファイルのバージョンはファイルバージョンとするのが普通のようだ。

さて、これらのバージョンには「バージョン文字列」と4つの数値:「メジャーバージョン」「マイナーバージョン」「ビルドナンバー」「パッチナンバー」をそれぞれに持っている。

Windowsエクスプローラで EXE ファイルのプロパティー→詳細タブを開くと、バージョン情報が表示されるが

  • 製品バージョンは、バージョン文字列(-product-version=)がそのまま表示される
  • ファイルバージョンは、「メジャーバージョン(-ver-major=)」「マイナーバージョン(-ver-minor=)」「パッチナンバー(-ver-patch=)」「ビルドナンバー(-ver-build=)」をピリオドで連結したテキストが表示される。

ようになっているようだ。

なお、古い goversioninfo.exe には「-product-ver-*****」という引数はない (わしがプルリク送った)。

最新版をゲットしてくれ…といいたいところだが、make.cmd には最新版の goversioninfo.exe を自動で入手してくれる機能がある(続く)