ぬうぱんの備忘録

技術系のメモとかいろいろ

作った曲一覧はこちら

bazel 上で圧縮ファイルをダウンロードして pkg_tar rule に組み込みたい

やりたいこと

  • 任意の圧縮ファイルを任意のサーバーから落とす
  • そのファイルの中身をまるごと pkg_tar rule の srcs として取り入れたい

なんで pkg_tar に取り込みたい?

  • container_image rule の tars にそのまま突っ込める
  • コレができると bazel 上での docker image ビルドがとっても楽

やりかた

WORKSPACE ファイルでファイルダウンロードを記述

http_archive(
    name = "my_archive",
    urls = ["<insert your URL>"],
    sha256 = "<insert your hash>",
    type = "<.zip, .tar.gz, .tar.xz, ...>",
    build_file_content = """
filegroup(
    name = "srcs",
    srcs = glob(["**"]),
    visibility = ["//visibility:public"]
)
"""
)

BUILD ファイルで pkg_tar を記述

load("@bazel_tools//tools/build_defs/pkg:pkg.bzl", "pkg_tar")

pkg_tar(
    name = "my_package",
    package_dir = "/opt/local",
    srcs = [
        "@my_archive//:srcs",
    ],
    strip_prefix=".",
    mode = "0755",
    visibility = ["//visibility:public"],
)

filegroupsrcs = glob(["**"])

  • * だとダメで ** が正解
  • * だと最上位階層だけ列挙される

pkg_tarstrip_prefix="."

  • これを書いておかないと圧縮ファイルの中身が平ら(flatten)に展開されてしまう
  • . を指定すればディレクトリ構造がそのまま維持される
  • 公式のドキュメントに思いっきり書いてあった docs.bazel.build

参考