我有两个Skylark扩展规则:blah_library
和blah_binary
。所有blah_library
的传递依赖关系都会通过返回provider(transitive_deps=...)
进行传播,并由任何最终的依赖blah_binary
目标进行适当处理。
我希望每个blah_library
也创建一个filegroup
,其中包含上面提到的所有传递依赖项,以便我可以单独访问它们。例如,我希望能够将它们作为数据依赖项传递给cc_binary
。换句话说:
# Somehow have this automatically create a target named `foo__trans_deps`?
blah_library(
name = "foo",
srcs = [...],
deps = [...],
)
cc_binary(
...,
data = [":foo__trans_deps"],
)
我该怎么做?任何帮助将不胜感激!
我尝试制作一个像这样的宏:
_real_blah_library = rule(...)
def blah_library(name, *args, **kwargs):
native.filegroup(
name = name + "__trans_deps",
srcs = ???,
)
_real_blah_library(name=name, *args, **kwargs)
但我不确定如何从宏中访问provider
提供的_real_blah_library
,因此我不知道如何填充filegroup
的{{1} }} field ...
srcs
规则的实施现在我有类似的东西:
blah_library
我尝试将以下内容添加到_blah_provider = provider(fields=['transitive_deps'])
def _blah_library_impl(ctx):
...
trans_deps = []
for dep in ctx.attr.deps:
trans_deps += dep[_blah_provider].trans_deps
return _blah_provider(trans_deps=trans_deps)
blah_library = rule(impl=_blah_library_impl, ...)
,但它不起作用,因为显然_blah_library_impl
无法在规则的实现中调用(“native.filegroup
”):
filegroup() cannot be called during the analysis phase
答案 0 :(得分:1)
您无法轻松创建这样的文件组,但您仍然可以实现您想要的目标。
如果您要使用genrule.srcs
,filegroup.srcs
,cc_binary.data
等规则,请返回DefaultInfo
提供商(以及_blah_provider
)并将files
字段设置为文件的传递闭包。
如果您在规则处于data
属性时需要一组不同的文件而不是其他任何文件(例如srcs
),则可以优化解决方案:还可以设置与运行文件相关的文件DefaultInfo
中的成员。 (坦率地说,我不知道它们之间的区别,我只是将所有runfiles-fields设置为相同的值。)
答案 1 :(得分:0)
我最终制定了自己的特殊SELECT top 100 Id
FROM TestTable
where
(Code like 'a000' + '%' or contains(Desc , 'a000*' ) )
AND (Active!='N' or Active is null)
ORDER BY Code
- 类似规则,正如@ Laszlo的答案中的评论中所讨论的那样。这是原始代码,以防它对任何人都是一个有用的起点:
filegroup