DefaultInfo和PyInfo有什么关系

What is the relationship between DefaultInfo and PyInfo

我不清楚 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"),
    ])

我正在创建冗余 depsets 以满足这些提供者,这让我觉得我可能做错了。

我还尝试了另一种循环所有部门的 default_runfiles 的方法,并使用 runfiles.merge 作为 DefaultInfo。对于简单的情况,这些方法看起来是等价的,但我不知道是否还有其他情况下这些方法会有所不同。

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

DefaultInfo 是 Bazel 的已知类型:

  • files 控制在 bazel build 目标时构建哪些文件,
  • runfiles 定义执行目标时需要在沙箱中显示哪些文件。

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

我的猜测是重复是必要的,因为值可能不同,所以删除重复将意味着 Bazel 没有 build/include 正确的文件,或者使用 Python 规则缺少信息.