0

假设我有一个生成 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规则?

4

1 回答 1

0

一种方法是编写您自己的 Starlark 规则,该规则返回一个PyInfo 提供程序,其中您生成的文件位于transitive_sources. 然后,您将该规则添加到depspy_library 规则的属性中。

缺点是您必须在加载阶段(因此在代码生成发生之前)知道您的工具将生成哪些文件,而不是使用 zips/jars 作弊。

如果这不是一个选项,我可以想到一个 hacky 解决方法,您可以在其中生成一个您在 py_libarary 的数据部门中依赖的 zip。然后在实际导入之前在运行时解压文件。

根据您设置 python 规则的方式,您可能还可以在代码生成器中构建 python 轮并依赖它。

于 2021-02-06T20:47:49.927 回答