重新打包档案时如何只修改一个文件?

How to modify just one file when repackaging an archive?

我正在尝试获取一个非 Bazel 生成的 zip 文件,修改其中的一些文件,保留其中的大部分文件,然后最终生成一个包含原始内容(加上我的修改)的新 tarball

我在以简洁的方式指定我的规则时遇到了问题,如果有关于如何操作的建议,那就太好了。

我正在通过 'new_http_archive' WORKSPACE 规则导入原始 zip 文件。这很好用。我将构建文件放在根目录下一层的包中。我们称之为 'foo_repackage'.

在foo_repackage/BUILD.root_archive:

package(default_visibility = ["//visibility:public"])

filegroup(
    name = "all_files",
    srcs = glob(
        ["**"],
        exclude = ["*", "share/doc/api/**"]
    ),
)

更大的问题在 foo_repackage/BUILD 文件中,我想将所有文件从上面的 all_files 组中取出,except对于其中的一些,我将进行修改。我看不出如何轻松做到这一点。似乎我想要修改的每个文件都应该从上面的 glob 中排除,并制定一个指定该文件的新规则。这意味着我必须继续修改全局 all_files 排除规则。

如果我可以创建一个新的文件组,其中包含上述所有文件并排除一些文件,那就太理想了。

我应该提到最后一步当然是使用 pkg_tar 重新打包结果 - 这是在 foo_repackage/BUILD

pkg_tar(
    name = "OutputTarball",
    files = ["@root_archive//:all_files"],
    deps = [":layers_of_modified_files"],
    strip_prefix = "/../root_archive",
)

有没有人有更好的方法来做到这一点?

谢谢,肖恩

你能使用像这样的变量吗:

MODIFIABLE_FILES = [
    "some/file",
    "another/file",
    ...
]

filegroup(
    name = "static-files",
    srcs = glob(["**"], exclude = MODIFIABLE_FILES)
)

filegroup(
    name = "modifiable-files",
    srcs = MODIFIABLE_FILES,
)

然后静态文件和可修改文件的列表将保持同步,如果您不小心指定了一个不存在的可修改文件,您将得到一个构建错误。