如何解决如何在自定义 Bazel 规则或 genrule 中打包生成的 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
规则?
解决方法
执行此操作的一种方法是编写您自己的 Starlark 规则,该规则返回一个 PyInfo provider,其中包含您在 transitive_sources
中生成的文件。然后将该规则添加到 py_library 规则的 deps
属性中。
缺点是您必须在 loading phase 处(因此在代码生成发生之前)知道您的工具将生成哪些文件,不能使用 zips/jars 作弊。
如果这不是一个选项,我可以想到一个hacky解决方法,您可以在py_libarary的数据仓库中生成一个依赖于的zip。然后在实际导入之前在运行时解压缩文件。
根据您设置 Python 规则的方式,您也可以在代码生成器中构建一个 Python 轮子并依赖于它。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。