假设我有一个生成Java和Python代码的脚本。它生成的文件取决于输入配置,它可以根据配置而变化。现在,对于Java,我可以编写一个简单的genrule,指向调用脚本,然后调用jar命令来生成所生成Python文件的单个源包。
例如:
genrule(
name = "generated_java_srcjar",
srcs = glob([
":input-files"
]),
outs = [
"xsd.srcjar"
],
cmd = """
mkdir -p $(GENDIR)/generated-code
$(location path/to/custom/script) --output-directory $(GENDIR)/generated-code --input $(locations :input-files)
$(JAVABASE)/bin/jar cMf $@ -C $(GENDIR)/generated-code .
""",
)
java_library(
name = "generated_java_jar",
srcs = [
":generated_java_srcjar"
],
)在Java示例中,为了声明genrule的输出,我能够生成单个输出(所生成文件的源包),然后使用与java_library规则中的源相同的规则。
现在,我想用Python实现一些类似的东西。如何在调用自定义脚本后打包生成的Python文件,以便将其作为源文件传递给py_library规则?
发布于 2021-02-07 04:47:50
要做到这一点,一种方法是编写您自己的Starlark规则,该规则在transitive_sources中使用您生成的文件返回一个PyInfo provider。然后将该规则添加到py_library规则的deps属性中。
缺点是您必须在loading phase上(因此在代码生成发生之前)知道您的工具将生成哪些文件,而不是使用zips/jars。
如果这不是一种选择,我可以考虑一种老套的变通方法,在py_libarary的data dep中生成一个您所依赖的zip。然后,在实际导入文件之前,在运行时对其进行解压缩。
根据您设置python规则的方式,您还可以在代码生成器中构建python轮子并依赖它。
https://stackoverflow.com/questions/65672680
复制相似问题