3

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

repository_ctx.file(filename)

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

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

repository_name 实际上在哪里repository_ctx.name

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

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

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

4

1 回答 1

1

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

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

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

export_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获取文件的路径。

于 2017-04-17T17:44:18.840 回答