是否有可能从Bazel .bzl规则获得$ pwd值?

时间:2017-11-27 17:28:44

标签: 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 - 我不认为此规则对我有用,但可能只是错误地使用它。
  4. 我需要的是运行Bazel .bzl规则的cmd正在运行的目录。例如:/Users/[user_name]/git/workspace/path/to/bazel/rule.bzl或至少在WORKSPACE目录之前的路径的第一部分。

    我无法使用pwd因为我在调用ctx.actions.run_shell()

    之前需要此值

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

1 个答案:

答案 0 :(得分:1)

目标是拥有密封的构建,所以你不应该依赖绝对路径。

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

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

bazel build :all --define=path=$(pwd)

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

根据您在下方的评论,您希望路径声明输出。让我再说一遍:您不应该使用绝对路径来声明输出文件。在包中声明输出。然后询问您调用的工具以使用该输出。

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

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

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