我有一个程序可以查看我语言的源文件,并为其构建规则的deps=[]
值导出正确的值。
我正在寻找一种替代所有现有规则(看起来像这样)的方法:
build_lib(name = "foo", deps = [...])
build_lib(name = "bar", deps = [...])
build_lib(name = "baz", deps = [...])
要改为:
build_lib_new(name = "foo")
build_lib_new(name = "bar")
build_lib_new(name = "baz")
通过调用我的程序在规则内部在内部解析相同的指定dep。
理想情况下,build_lib_new
只是build_lib
周围的包装规则:
def derive_deps(name):
deps = []
# call my tool somehow?
return deps
def build_lib_new(name):
deps = derive_deps(name)
build_lib(name,deps)
现在,我被卡住了。不幸的是,我认为bazel希望在分析阶段中预先了解所有依赖项。我看到它们是运行shell命令的动作,但是我相信这些动作是在生成依赖图之后发生的。
我是否需要在bazel外部运行外部工具来重写BUILD
文件?
答案 0 :(得分:3)
是否需要在bazel外部运行外部工具来重写BUILD文件?
简而言之,是的。这就是为什么存在诸如Gazelle和Jadep之类的工具的原因。
如果您的工具在执行阶段 期间作为操作运行,则在加载和分析阶段不存在dep。您需要在加载/分析之前 运行工具,也许是repository rule?
我看到它们是运行shell命令的动作,但是我相信这些动作是在生成依赖图之后发生的。
正确。分析阶段将创建已配置的目标图,并将其还原为执行阶段的动作(shell命令,工件等)图。