【问题标题】:How to package generated python files in custom Bazel rule or genrule?如何在自定义 Bazel 规则或 genrule 中打包生成的 python 文件?
【发布时间】:2021-01-11 18:36:07
【问题描述】:

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

【问题讨论】:

    标签: python bazel bazel-rules


    【解决方案1】:

    执行此操作的一种方法是编写您自己的 Starlark 规则,该规则返回 PyInfo provider,生成的文件位于 transitive_sources 中。然后将规则添加到 py_library 规则的 deps 属性中。

    缺点是你必须在loading phase 知道(所以在代码生成之前)你的工具会生成什么文件,不能用 zips/jars 作弊。

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

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

    【讨论】:

      猜你喜欢
      • 2022-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多