バッチファイルの話もするとたいへんなので、以下 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 を自動で入手してくれる機能がある(続く)