使用Bazel创建和读取临时文件

时间:2017-04-17 17:36:56

标签: bazel custom-build

我正在尝试使用Bazel为TensorFlow设置我的自定义构建系统。 我需要在配置步骤中创建一个临时文件,我将在构建步骤中将其用作缓存。 我能够在我的.bzl文件中创建它:

repository_ctx.file(filename)

在配置之后,我可以在文件夹中看到它:

$HOME/.cache/bazel/_bazel_$USERNAME/%MD5%/external/%repository_name%

其中repository_name实际上是repository_ctx.name

但是我无法在构建期间从我的.tpl脚本访问此路径。我想通过repository_ctx.template的替换从.bzl脚本发送它,但即使在这里我也找不到如何找到这条路径!

看起来我不能使用像bazel-out或bazel-genfiles这样的符号链接来访问这个文件夹(听起来很有希望,但不是......)。我也无法在此文件夹之外创建文件。

这是一个非常简单的问题,我无法相信除了硬编码路径或find它之外别无他法......

1 个答案:

答案 0 :(得分:1)

我猜测问题是你没有在repo的BUILD文件中公开文件,以便你的构建使用它。您需要执行以下操作:

repository_ctx.file('whatever')
repository_ctx.file('BUILD', 'exports_files(["whatever"])')

然后您可以在任何其他BUILD文件中使用@repository_name//:whatever

exports_files用于让包依赖于来自其他包的源文件。

然后,在您的.bzl文件中,您在构建时加载,将文件添加为属性,例如,

attrs = {
    '_my_external_src' : attr.label(
        default = Label('@my_repository//:whatever'),
        allow_single_file = True,
    ),
},

然后,在规则实现中,您可以通过上下文访问它:

def _impl(ctx):
    print(ctx.file._my_external_src.path)

.path获取文件的路径。

相关问题