我试图从.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配置中是否没有包含此值的属性?
答案 0 :(得分:1)
目标是拥有密封的构建,所以你不应该依赖绝对路径。
在pwd
的命令中随意使用ctx.actions.run_shell()
(对于可重现的构建,请注意,避免将绝对路径放在生成的文件中)。
修改强>
从技术上讲,有一些解决方法。例如,您可以通过--define
标志传递路径:
bazel build :all --define=path=$(pwd)
然后使用ctx.var["path"]
可以获得该值。
根据您在下方的评论,您希望路径声明输出。让我再说一遍:您不应该使用绝对路径来声明输出文件。在包中声明输出。然后询问您调用的工具以使用该输出。
例如,当您调用gcc时,可以使用-o
指定输出。当工具写入stdout时,使用shell重定向它。如果该工具真的不灵活,您可能希望用自己的脚本包装它(例如调用该工具并复制输出文件)。
这里使用绝对路径不是正确的解决方案。例如,应该可以在远程计算机上执行操作(绝对路径没有意义。
Zip可能是一个合理的解决方案。当您无法事先知道输出文件的数量或名称时,它很有用。