有没有办法为特定规则生成 deps 列表?

Is there any way to generate the deps list for particular rules?

我有一个程序可以查看我的语言的源文件,并为其构建规则的 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 文件?

Do I have to run the external tool outside of bazel to rewrite BUILD files?

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

如果您的工具 运行 在 执行阶段作为操作 ,那么在加载和分析阶段将不存在 deps。在 loading/analysis 之前,您需要 运行 工具 ,也许作为 repository rule

I see that their are actions to run shell commands, but I believe those happen after the dependency graph is made.

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