🔨

Bazel で使用する外部モジュールのバージョンが更新されない問題とその解決

2023/04/30に公開

初稿: 2023-04-30
小松弘幸 (@komatsuh)

記事の内容

ビルドシステムの Bazel で、WORKSPACE.bazel ファイルに設定した内容が期待通り反映されない問題に対しての、原因と解決方法を紹介します。

用語

  • Bazel: ビルドシステム。Make や CMake などと同じ役割のもの。この記事は Bazel についてはすでに知っている方むけです。
  • WORKSPACE.bazel: Bazel で使用する設定ファイル。依存する外部モジュールについて設定などを記述します。

WORKSPACE.bazel について

ビルドシステムの Bazel で外部モジュールを使用するには、WORKSPACE.bazel に設定を記述します。

たとえば、 Bazel skylib1.0.2 を使用する場合は下記のようにします。

# Bazel Skylib
http_archive(
    name = "bazel_skylib",
    sha256 = "97e70364e9249702246c0e9444bccdc4b847bed1eb03c5a3ece4f83dfe6abc44",
    urls = [
        "https://mirror.bazel.build/github.com/bazelbuild/bazel-skylib/releases/download/1.0.2/bazel-skylib-1.0.2.tar.gz",
        "https://github.com/bazelbuild/bazel-skylib/releases/download/1.0.2/bazel-skylib-1.0.2.tar.gz",
    ],
)
load("@bazel_skylib//:workspace.bzl", "bazel_skylib_workspace")
bazel_skylib_workspace()

バージョンが更新されない問題とその解決

これを 1.4.1 に更新する場合は sha256urls を適切に書き換えればよいのですが、期待通りに更新されない問題に遭遇しました。

調べた結果、この設定の前に、別のモジュールがすでに同じモジュールを読み込んでいたことが原因でした。

NG
# Protocol buffers
# この設定が内部的に Bazel Skylib 1.0.2 を設定していた
local_repository(
    name = "com_google_protobuf",
    path = "third_party/protobuf",
)
load("@com_google_protobuf//:protobuf_deps.bzl", "protobuf_deps")
protobuf_deps()

# Bazel Skylib
# すでに Bazel Skylib 1.0.2 が設定されているので、なにもしない
http_archive(
    name = "bazel_skylib",
    sha256 = "b8a1527901774180afc798aeb28c4634bdccf19c4d98e7bdd1ce79d1fe9aaad7",
    urls = [
        "https://mirror.bazel.build/github.com/bazelbuild/bazel-skylib/releases/download/1.4.1/bazel-skylib-1.4.1.tar.gz",
        "https://github.com/bazelbuild/bazel-skylib/releases/download/1.4.1/bazel-skylib-1.4.1.tar.gz",
    ],
)
load("@bazel_skylib//:workspace.bzl", "bazel_skylib_workspace")
bazel_skylib_workspace()

読み込む順番を入れ替えることで、期待したバージョンが読み込まれるようになりました。

OK
# Bazel Skylib
# バージョン 1.4.1 を設定する
http_archive(
    name = "bazel_skylib",
    sha256 = "b8a1527901774180afc798aeb28c4634bdccf19c4d98e7bdd1ce79d1fe9aaad7",
    urls = [
        "https://mirror.bazel.build/github.com/bazelbuild/bazel-skylib/releases/download/1.4.1/bazel-skylib-1.4.1.tar.gz",
        "https://github.com/bazelbuild/bazel-skylib/releases/download/1.4.1/bazel-skylib-1.4.1.tar.gz",
    ],
)
load("@bazel_skylib//:workspace.bzl", "bazel_skylib_workspace")
bazel_skylib_workspace()

# Protocol buffers
# すでに設定されている Bazel Skylib 1.4.1 を使用する
local_repository(
    name = "com_google_protobuf",
    path = "third_party/protobuf",
)
load("@com_google_protobuf//:protobuf_deps.bzl", "protobuf_deps")
protobuf_deps()

わかってしまえば「なるほどね」という話なのですが、原因を特定するまでにしばらく時間がかかってしまった問題でした。

GitHubで編集を提案

Discussion