【问题标题】:Is there any way to generate the deps list for particular rules?有没有办法为特定规则生成 deps 列表?
【发布时间】:2018-07-05 03:47:14
【问题描述】:

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

【问题讨论】:

  • 如果要写这样的工具,看github.com/bazelbuild/buildtools。它包含用于解析/编辑/打印 BUILD 文件的功能。我们将随着时间的推移扩展这些功能,以便更轻松地构建此类工具。

标签: dependencies bazel bazel-extra-action


【解决方案1】:

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

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

如果您的工具在执行阶段作为操作运行,那么在加载和分析阶段将不存在deps。您需要在加载/分析之前运行该工具,可能是repository rule?

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

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

【讨论】:

  • 好的,感谢您的确认。 Gazelle、Jadep 和存储库规则听起来很有希望。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-27
  • 2017-02-24
  • 1970-01-01
  • 2015-08-19
  • 1970-01-01
  • 2015-07-30
  • 1970-01-01
相关资源
最近更新 更多