You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 13:33:10