将自定义bazel规则的输出作为运行时数据传递给*u二进制规则

将自定义bazel规则的输出作为运行时数据传递给*u二进制规则,bazel,Bazel,我有一个创建文件夹的规则(untars a tar.gz),我想直接使用这个文件夹作为cc_二进制文件的数据。我能找到的唯一方法是创建一个中间文件组,将创建的文件夹作为源 虽然它可以工作,但需要规则的用户创建一个中间文件组,并引入一些命名问题,因为文件组的名称不能与创建的文件夹名称相同 这就是我所拥有的 # rules.bzl def _untar_impl(ctx): tree = ctx.actions.declare_directory(ctx.attr.out) ctx.

我有一个创建文件夹的规则(untars a tar.gz),我想直接使用这个文件夹作为cc_二进制文件的数据。我能找到的唯一方法是创建一个中间文件组,将创建的文件夹作为源

虽然它可以工作,但需要规则的用户创建一个中间文件组,并引入一些命名问题,因为文件组的名称不能与创建的文件夹名称相同

这就是我所拥有的

# rules.bzl
def _untar_impl(ctx):
    tree = ctx.actions.declare_directory(ctx.attr.out)
    ctx.actions.run_shell(
        inputs = [ctx.file.src],
        outputs = [tree],
        command = "tar -C '{out}' -xf '{src}'".format(src=ctx.file.src.path, out=tree.path),
    )

    return [DefaultInfo(files = depset([tree]))]

untar = rule(
    implementation = _untar_impl,
    attrs = {
        "src": attr.label(mandatory=True, allow_single_file = True),
        "out": attr.string(mandatory=True),
    },
)

# BUILD
untar(
    name = "media",
    src = "media.tar.gz",
    out = "media",
)

filegroup(
    name = "mediafiles",
    srcs = ["media"],
    data = [":media"],
)

cc_binary(
    name = "main",
    srcs = ["main.cpp"],
    data = [":mediafiles"],
)

有没有办法避免使用中间文件组?

根据随后的讨论,我发现我对问题陈述有点误解。您可能仍然希望将tarball(及其整个处理)作为一个外部依赖项和
存储库规则
来处理,但是您需要中间
文件组
这一直接问题

如果您注意到,您已经定义了
src
data
来指向
媒体标签,这正是执行
*\u二进制
规则时缺少的数据位。因为
untar
规则返回了
文件
depset
,但是直接使用
数据
时会解析为空

如果在规则定义中替换此行:

return [DefaultInfo(files = depset([tree]))]
与:

然后,您可以在
构建
文件中说:

cc_binary(
    name = "main",
    srcs = ["main.cpp"],
    data = [":media"],
)

因为
untar
规则现在提供了。
文件组
通过其
数据
属性包装和添加
媒体
已经做到了这一点。

这种方法的问题是,媒体文件夹中的所有内容都必须是标题或cpp,而我有随机媒体文件
错误:工件'…/media.cpp/font.ttf'从目录工件展开“…/media.cpp”既不是头文件,也不是源文件。
将其作为外部依赖项处理也会有好处:您提供了
BUILD
文件,以确保仅公开存档中需要/想要的文件。同样,我不知道您的具体情况,但至少从表面上看,以这种方式使用tarball听起来是一种干净的方法。我的tar.gz是由另一条规则生成的,首先获取外部依赖项,然后进行一些预处理以生成tar.gz。tarball包含很多文件,所以我尽量避免列出所有文件。所以,如果你有一个外部dep。。。您的
cc_二进制文件需要一些(已处理的;其他规则)输入,使用tarball(混合内容)将一个规则的输出传递给另一个规则,听起来比它应该的要复杂一些。当您获得ext.dep时,听起来任何为
cc\u binary
生成输入的东西都应该这样做。。。如果您还希望发布一个tarball,那么它是一个单独的目标(构建树的叶节点)?我遗漏了什么实质性的东西吗?我不确定我是否明白。所以我的设置如下,我有一个外部存储库,里面有一堆加密的文件,我有一个规则,可以解密这些文件并生成一个tar球。我的设置可以正常工作,但我想知道是否可以通过删除中间文件组来简化它。当然,我可以让解密规则直接生成一个文件夹,但我仍然需要中间文件组。谢谢你的帮助(顺便说一句:)
cc_binary(
    name = "main",
    srcs = ["main.cpp"],
    data = [":media"],
)