bazelでGoのldflagsを使う

tldr

サンプルは こちら

解説

bazelでldflagsを使うには2通りあります。

  • BUILD.bazelにベタ書きする
  • bazelコマンド実行時に--workspace_status_commandに渡す

ベタ書きする方法

簡単な方法。BUILD.bazelのルールにx_defs属性を追加します。 例)

こんなコードがあったら

package version

var Version = "redacted"

こんな感じで埋め込みます

go_binary(
    name = "cmd",
    srcs = ["main.go"],
    deps = ["//version:go_default_library"],
    x_defs = {"example.com/repo/version.Version": "0.9"}, # here!
)

bazelコマンド実行時に–workspace_status_commandに渡す方法

上記と同じコードがあった場合、 埋め込みたい情報を変数として波括弧で囲んで書いておきます。

go_binary(
    name = "cmd",
    srcs = ["main.go"],
    deps = ["//version:go_default_library"],
    x_defs = {"example.com/repo/version.Version": "{STABLE_GIT_COMMIT}"}, # here!
)

bazelに渡す情報を導出するスクリプトを書いておきます。

#!/bin/bash

echo STABLE_GIT_COMMIT $(git rev-parse HEAD) // STABLE_GIT_COMMIT hogehoge みたいになります。複数渡したいときは複数行書く

あとはbazelコマンド実行時に--workspace_status_commandフラグにスクリプトのパスを渡せばOKです! 下記のドキュメントでは相対パスが書かれてますが、私の環境では絶対パスでないとダメでした。要調査。

bazel build --workspace_status_command=${PWD}/status.sh //:cmd

参考にしたもの

rules_go: Defines and stamping

Kenta Kozuka
Kenta Kozuka
Software Engineer

東京で働くエンジニア