从Bazel中的目标/提供者列表中提取/收集文件的最有效方法是什么?

从Bazel中的目标/提供者列表中提取/收集文件的最有效方法是什么?,bazel,starlark,bazel-rules,Bazel,Starlark,Bazel Rules,随着我的进步,我正在写一些规则并学习Starlark 假设我有自己的提供商: ModularResources=提供程序( doc=“模块化资源”, 字段={ “artifactId”:“前Maven工件id(别问我为什么)”, “SRC”:“标签列表(一个全局(..)事物)”, }, ) def模块化资源导入(ctx): 返回源( artifactId=ctx.attr.artifactId, srcs=ctx.attr.srcs, ) 模块化资源=规则( 实现=\u模块化\u资源\u实施,

随着我的进步,我正在写一些规则并学习Starlark

假设我有自己的提供商:

ModularResources=提供程序(
doc=“模块化资源”,
字段={
“artifactId”:“前Maven工件id(别问我为什么)”,
“SRC”:“标签列表(一个全局(..)事物)”,
},
)
def模块化资源导入(ctx):
返回源(
artifactId=ctx.attr.artifactId,
srcs=ctx.attr.srcs,
)
模块化资源=规则(
实现=\u模块化\u资源\u实施,
属性={
“artifactId”:attr.string(
强制=真,
),
“srcs”:attr.label\u列表(
allow_files=True,
强制=真,
),
},
)
然后我有一个生成器规则,它要求:

some_生成器=规则(
属性={
“deps”:属性标签列表(
提供者=[ModulerResources]
),
...
},
...
)
在我的实现中,我发现我需要执行几个展开来获取文件:

def\u获取文件(dep):
结果=[]
对于dep中的dep:
对于dep[ModulerResources]中的目标。srcs:
结果+=target.files.to_list()
返回结果
是否有更有效的方法来执行收集

至于我为什么这样做,生成器实际上需要一个特殊的文件列表,如下所示:

def格式文件(dep):
formatted=“”
对于dep中的dep:
对于dep[ModulerResources]中的目标。srcs:
格式化的+=“,”.join([dep[modulerResources].artifactId+”:“+f.path for f in target.files.to_list()]))
返回格式
FWIW,下面是一个如何使用的示例:

a/BUILD

modular\u资源(
name=“生成器资源”,
srcs=glob(
[“some/path/**.whatever”],
),
artifactId=“a”,
可见性=[“//可见性:公共”],
)
b/构建

some\u生成器(
name=“…”,
deps=[
“//a:生成器\u资源”
]
)

如果您想用内存换取更好的性能,那么blaze可以更轻松地将操作并行化,如果它是在提供程序中执行的:

def\u模块化资源\u impl(ctx):
返回源(
artifactId=ctx.attr.artifactId,
格式化的_srcs=“,”.join([artifactId+:“+f.path for f in ctx.files.src]”)
)

您的实现在我看来是合理的。你真的观察到性能问题了吗?没有。我还没有到调查性能问题的地步。只是好奇正确的方法(tm)。