如果项目对本地安装的软件具有外部依赖性,并且无法通过new_http_archive
或new_git_repository
进行管理,因为许可或大小问题会阻止其下载,有没有办法让new_local_repository
指定的路径使用环境变量?
查看comments上的Issue #746,看起来这是以某种方式解决的。但是我找不到任何关于如何做的文档。
答案 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 action和you 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
)