我正在尝试从 .bzl 规则中获取完整当前目录路径的值。我试过以下:
ctx.host_configuration.default_shell_env.PATH 返回 "/Users/[user_name]/.rbenv/shims:/usr/local/bin:/usr/bin:/bin:...
ctx.bin_dir.path 返回 bazel-out/local-fastbuild/bin
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 配置中是否没有包含此值的属性?
目标是实现密封构建,因此您不应依赖绝对路径。
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 可能是一个合理的解决方案。当您无法提前知道输出文件的数量或名称时,它非常有用。