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

是否可以从Bazel.bzl规则中获取$pwd值?,bazel,Bazel,我试图从.bzl规则中获取完整当前目录路径的值。我尝试过以下方法: ctx.host\u配置。默认shell\u环境路径返回“/Users/[user\u name]/.rbenv/shimmers:/usr/local/bin:/usr/bin:/bin:… ctx.bin_dir.path返回bazel out/local fastbuild/bin pwd=ctx.expand\u make\u variables(“cmd”、“$$pwd”、{})返回字符串$pwd-我认为这条规则对我没

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

  • ctx.host\u配置。默认shell\u环境路径
    返回
    “/Users/[user\u name]/.rbenv/shimmers:/usr/local/bin:/usr/bin:/bin:…

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

  • pwd=ctx.expand\u make\u variables(“cmd”、“$$pwd”、{})
    返回字符串
    $pwd
    -我认为这条规则对我没有帮助,但可能只是用错了
  • 我需要的是运行Bazel.bzl规则的cmd运行的目录。例如:
    /Users/[user\u name]/git/workspace/path/to/Bazel/rule.bzl
    ,或者至少是工作区目录之前路径的第一部分

    我不能使用
    pwd
    ,因为在调用
    ctx.actions.run\u shell()之前需要这个值


    Bazel配置中是否没有保存此值的属性?

    目标是实现气密构建,因此不应依赖于绝对路径

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


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

    bazel build :all --define=path=$(pwd)
    
    然后使用
    ctx.var[“path”]
    可以获得该值


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

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

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


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

    在调用
    run\u shell()
    之前,我需要
    pwd
    ,以便声明输出文件来自python的
    coverage
    命令(Coverage.py实用程序使用绝对路径为html报告命名源文件)。我没有明确声明输出文件,而是决定将它们压缩(通常更好地解决我的问题)。如果您确认没有办法将绝对路径放入
    run_shell()之外的bazel变量,我可以接受您的答案
    。再次感谢您,尽管我的意图不是在绝对路径位置声明输出。我要说的是Coverage.py工具采用绝对路径,将
    /
    切换为
    \u
    ,并将其用作它生成的html文件的名称。因此,所有内容仍然是保密的,我只想知道输出文件的名称乐。