1

我有一个程序可以查看我的语言的源文件,并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")

通过调用我的程序,在规则内部解析了相同的指定 deps。

理想情况下,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文件?

4

1 回答 1

3

我是否必须在 bazel 之外运行外部工具来重写 BUILD 文件?

简而言之,是的。这就是存在 Gazelle 和 Jadep 等工具的原因。

如果您的工具执行阶段作为操作运行,则在加载和分析阶段将不存在这些依赖项。您需要在加载/分析之前运行该工具,也许作为存储库规则

我看到它们是运行 shell 命令的操作,但我相信这些是在创建依赖图之后发生的。

正确的。分析阶段创建配置的目标图,并将其具体化为执行阶段的操作(shell 命令、工件等)图。

于 2018-07-04T19:41:59.757 回答