是否可以从 Bazel .bzl 规则中获取 $pwd 值?

Zei*_*ist 5 bazel

我正在尝试从 .bzl 规则中获取完整当前目录路径的值。我试过以下:

  1. ctx.host_configuration.default_shell_env.PATH 返回 "/Users/[user_name]/.rbenv/shims:/usr/local/bin:/usr/bin:/bin:...

  2. ctx.bin_dir.path 返回 bazel-out/local-fastbuild/bin

  3. pwd = ctx.expand_make_variables("cmd", "$$PWD", {})返回字符串$PWD- 我认为这个规则对我没有帮助,但可能只是使用错误。

我需要的是运行 Bazel .bzl 规则的 cmd 所在的目录。例如:/Users/[user_name]/git/workspace/path/to/bazel/rule.bzl或者至少是 WORKSPACE 目录之前的路径的第一部分。

我无法使用,pwd因为我在调用之前需要这个值ctx.actions.run_shell()

Bazel 配置中是否没有包含此值的属性?

Lau*_*ent 4

目标是实现密封构建,因此您不应依赖绝对路径。

pwd请随意在命令中使用ctx.actions.run_shell()(对于可重现的构建,请小心,避免将绝对路径放入生成的文件中)。


编辑。 从技术上讲,有一些解决方法。例如,您可以通过--define标志传递路径:

bazel build :all --define=path=$(pwd)
Run Code Online (Sandbox Code Playgroud)

然后可以使用该值ctx.var["path"]


根据下面的评论,您希望声明输出的路径。让我重复一遍:您不应该使用绝对路径来声明输出文件。在包中声明输出。然后要求您调用的工具使用该输出。

例如,当您调用gcc时,您可以使用-o来指定输出。当工具写入 stdout 时,使用 shell 对其进行重定向。如果该工具确实不灵活,您可能需要用自己的脚本包装它(例如调用该工具并复制输出文件)。

此处使用绝对路径不是正确的解决方案。例如,应该可以在远程计算机上执行操作(在远程计算机上您的绝对路径没有意义。

Zip 可能是一个合理的解决方案。当您无法提前知道输出文件的数量或名称时,它非常有用。