如何在自定义Bazel规则或genrule中打包生成的python文件?

2024-06-26 00:30:13 发布

您现在位置:Python中文网/ 问答频道 /正文

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


Tags: 文件name脚本input源代码规则librarycode
1条回答
网友
1楼 · 发布于 2024-06-26 00:30:13

实现这一点的一种方法是编写自己的Starlark规则,该规则使用transitive_sources中生成的文件返回一个PyInfo provider。然后将该规则添加到py_库规则的deps属性中

缺点是您必须在loading phase(因此在代码生成之前)知道您的工具将生成哪些文件,而不是使用ZIP/JAR进行欺骗

如果这不是一个选择,我可以想出一个黑客的解决办法,在那里你可以生成一个你在你的图书馆的数据部门依赖的zip。然后,在实际导入文件之前,先在运行时解压缩文件

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

相关问题 更多 >