2

我不清楚 DefaultInfo 运行文件的 transitive_files 和 PyInfo transitive_sources 之间的区别是什么。它们是多余的还是有重要的区别?

例如,我有一个自定义的 starlark 规则,我想将其作为 PyInfo 提供程序,但我想添加一个额外的提供程序,所以我不能使用本机 py_library 规则。

    transitive_sources = [dep[PyInfo].transitive_sources for dep in ctx.attr.deps]
    return struct(providers = [
        DefaultInfo(
            files = depset(sources + outs),
            runfiles = ctx.runfiles(files = sources + outs, transitive_files = transitive_sources)
        ),
        PyInfo(
            transitive_sources = depset(direct = sources + outs, transitive = transitive_sources),
            imports = depset(
                direct = [_path_join(ctx.workspace_name, ctx.label.package, im) for im in ctx.attr.imports],
                transitive = [dep[PyInfo].imports for dep in ctx.attr.deps]
            )
        ),
        _EggLibraryInfo(aditional_info="other stuff"),
    ])

我正在创建冗余的 depset 来满足这些提供商的需求,这让我觉得也许我做错了。

我还尝试了另一种循环所有部门的方法default_runfiles,并将 runfiles.merge 用于 DefaultInfo。对于简单的情况,这些方法看起来是等效的,但我不知道是否存在其他方法会出现分歧的情况。

PyInfo 文档可以使用有关 transitive_sources 如何适应 DefaultInfo 以及为什么需要提供运行文件之外的其他机制的部分。https://docs.bazel.build/versions/master/skylark/lib/PyInfo.html

4

1 回答 1

1

DefaultInfo是 Bazel 已知的类型:

  • filesbazel build控制目标时构建的文件,
  • runfiles定义在执行目标时哪些文件需要存在于沙箱中。

PyInfo仅由 Python 规则使用,用于将元数据传播到使用目标。

我的猜测是重复是必要的,因为值可能不同,因此删除重复将意味着 Bazel 没有构建/包含正确的文件,或者使用 Python 规则缺少信息。

于 2020-05-03T13:05:54.613 回答