こんにちは。
タイトル通りですが、D言語でビルド時のコミットのハッシュをバイナリに組み込みたいという事になった場合に、どうすればいいか、ということについて書きます。
dubには様々なオプションが存在します。ここで使うのはpreGenerateCommands
を使います。
これは、dubでビルドする前にシェルのコマンドを叩くことができるオプションです。
これを使います。
また、最新のコミットのハッシュを得るにはgit rev-parse --short HEAD > version
というコマンドを用います。
したがって、イメージとしてはビルドに際して
-
preGenerateCommands
を用いてgit rev-parse --short HEAD > version
を実行する。 - D言語にはstring importと言うものが有り、それを用いて
version
というファイルを読み込む。 - これでバイナリにハッシュを組み込める!!!
という感じになります。
string importとは(これが正しい名前だったかは忘れてしまったのですが)、ビルド時に、string value = import("filepath");
とすることで、filepath
のファイルの中身をvalueに読み込むことができる機能です(なお、これを使うにはdmd
でビルドする時に-J
オプションで、filepath
のあるパスを指定する必要があります。)
以上をまとめると、次のようなコードで組み込む事ができます。
{
"name": "test_git",
"authors": [
"Akihiro Shoji"
],
"description": "A minimal D application.",
"copyright": "Copyright (c) 2017, Akihiro Shoji",
"license": "MIT",
"preGenerateCommands": ["bash getLatestCommitHash.sh"],
"dflags":["-J."]
}
import std.stdio;
enum string _version = import("./version");
void main() {
writeln("version : ", _version);
}
git rev-parse --short HEAD > version
このようにして書くと、ビルド時にバイナリに、最新のコミットのハッシュを埋め込むことが出来ます。