如何在WORKSPACE中引用环境变量?

时间:2017-12-02 01:17:46

标签: bazel

如果项目对本地安装的软件具有外部依赖性,并且无法通过new_http_archivenew_git_repository进行管理,因为许可或大小问题会阻止其下载,有没有办法让new_local_repository指定的路径使用环境变量?

查看comments上的Issue #746,看起来这是以某种方式解决的。但是我找不到任何关于如何做的文档。

2 个答案:

答案 0 :(得分:2)

  

看看问题#746的评论,看起来这是以某种方式解决的。但我找不到任何关于如何做的文件。

感谢您检查现有错误!那个bug差不多已经有两年了。从那时起,Bazel已经改变了一吨。

对于这个问题,我认为您应该在.bzl文件中编写自己的存储库规则。

允许存储库规则执行非密集操作,读取环境,查看整个文件系统等。正常构建规则不是,也不能访问环境或完整文件系统。

您的存储库规则应检查envvar的值并编写Bazel将在您的规则创建的外部存储库中使用的BUILD文件。

请在此处查看我的答案,例如:Call llvm-config --prefix and use it in a BUILD rule

答案 1 :(得分:0)

bazel中的首选方法是将工具也放在源代码存储库中,因为这是获得可重现构建的唯一方法。

但是,我认为you can use environment variables as part of an actionyou can reference environment variables in rules

我没有测试过,但我认为该规则看起来像proprietary_tool.bzl

def _proprietary_tool_impl(ctx):
    env = ctx.configuration.default_shell_env
    ctx.actions.run(
      inputs=ctx.attr.srcs,
      outputs=ctx.attr.out,
      executable=env['PROPRIETARY_TOOL_PATH'] + "/bin/tool",
    )

proprietary_tool = rule(
    implementation=_proprietary_tool_impl,
    attrs={}, # Add attributes needed by the proprietary tool
)