我不清楚 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