使用Bazel为TensorFlow生成编译命令时构建失败如何解决
问题根因
该报错由Bazel版本与TensorFlow依赖的构建规则版本不兼容导致:高版本Bazel强化了Starlark构建脚本的语法校验,禁止字符串中出现未双写转义的非法转义序列,而当前拉取的旧版io_bazel_rules_docker依赖中,container/image.bzl脚本的正则表达式部分直接写了\s、\c这类转义符,没有按规则写成\\s、\\c,直接触发脚本编译失败,构建流程中断。
解决步骤
- 优先对齐Bazel版本:TensorFlow对构建用的Bazel版本有严格的绑定要求,禁止直接使用最新版Bazel。进入拉取的TensorFlow源码根目录,打开
.bazelversion文件查看该版本TensorFlow要求的Bazel版本号,卸载本地当前安装的Bazel,安装对应版本的Bazel后重试,版本不匹配是这类构建报错的最常见诱因。 - 临时快速修复方案:如果对齐版本后仍报相同错误,直接打开报错路径指向的本地Bazel缓存下的
io_bazel_rules_docker/container/image.bzl文件,定位到第550行,将字符串中所有单独的\s替换为\\s、\c替换为\\c,保存后重新执行构建命令即可。注意该修改存在于Bazel缓存目录,执行清空缓存操作后会失效,仅适合临时跑通流程。 - 永久修复方案:打开TensorFlow源码根目录的WORKSPACE文件,找到
io_bazel_rules_docker依赖的拉取配置,将该依赖的版本升级到v0.14.4及以上(该版本已修复Starlark语法转义的兼容问题),重新拉取依赖后再执行构建。 - 重试构建前先执行
bazel clean --expunge清空全部历史构建缓存,避免旧的异常缓存文件干扰新的构建流程。
内容的提问来源于stack exchange,提问作者Nima shiri
相关产品推荐
相关产品推荐

