Bazel构建报target未在包中声明 external目录构建问题排查
报错原因
external是Bazel硬编码的保留虚拟包名,专门用于处理外部依赖的寻址,解析优先级高于工作区内的同名实体目录。你执行bazel build //external:aws时,Bazel不会加载你工作区下external/目录的BUILD文件,而是直接走内置的外部依赖解析逻辑,因此找不到你定义的aws目标。这也是目录名改回非保留的library后构建立刻恢复正常的核心原因。
解决方法
- 推荐做法:不要使用
external作为项目内的包目录名,替换为非保留名称即可,比如Bazel生态常用的third_party、deps等。修改后直接执行对应路径的构建命令即可,比如目录改名为third_party时,构建命令为bazel build //third_party:aws,无额外配置成本,也不会和Bazel后续版本的逻辑产生冲突。 - 不建议的做法:如果强制要使用
external作为目录名,需要通过启动参数修改Bazel的包解析优先级,让工作区实体目录的优先级高于内置虚拟包,但这种方式会破坏Bazel默认的外部依赖解析逻辑,很容易引发其他隐性构建问题,升级Bazel版本时也大概率失效。
附:问题相关配置参考
目录结构:
main | WORKSPACE | external | BUILD
WORKSPACE文件配置:
load("@rules_foreign_cc//foreign_cc:repositories.bzl", "rules_foreign_cc_dependencies") rules_foreign_cc_dependencies() _ALL_CONTENT = """\ filegroup( name = "all_srcs", srcs = glob(["**"]), visibility = ["//visibility:public"], ) """ new_git_repository( name = "aws_sdk", remote = "https://github.com/aws/aws-sdk-cpp", branch = "master", build_file_content = _ALL_CONTENT, init_submodules = True, recursive_init_submodules = True, )
external目录下BUILD文件配置:
load("@rules_foreign_cc//foreign_cc:defs.bzl", "cmake") cmake( name = "aws", cache_entries = { "CMAKE_BUILD_TYPE": "Release", "BUILD_ONLY": "dynamodb", "BUILD_SHARED_LIBS": "ON", "ENABLE_TESTING": "OFF", }, lib_source = "@aws_sdk//:all_srcs", out_shared_libs = [ "libaws-cpp-sdk-core.so", "libaws-cpp-sdk-dynamodb.so", ] )
构建报错信息:
ERROR: Skipping '//external:aws': no such target '//external:aws': target 'aws' not declared in package 'external' defined by /path/to/WORKSPACE WARNING: Target pattern parsing failed.
内容的提问来源于stack exchange,提问作者Victor M
相关产品推荐
相关产品推荐

