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

如何在Bazel中将远程可执行文件封装为sh_binary规则

Bazel配置实现步骤

你之前使用的http_file规则仅支持下载单个独立文件,无法自动处理压缩包解压逻辑,要实现全流程需求直接替换为Bazel原生的http_archive规则即可,它内置了压缩包下载、哈希校验、自动解压能力,不需要额外编写解压脚本。

1. 修改WORKSPACE配置

替换原有http_file配置为如下内容,配置中直接内嵌外部依赖的BUILD规则,不需要额外新建第三方依赖目录:

load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")

http_archive(
    name = "fantomas_nuget",
    sha256 = "98f2604859a377687c9a63b5a0148a47153224f19856142cc20705a96e1ea211",
    urls = ["https://www.nuget.org/api/v2/package/fantomas/5.0.0-alpha-010"],
    type = "zip", # 显式指定压缩格式,适配nupkg这类非.zip后缀的zip格式包
    # 若解压后所有文件都嵌套在某一层子目录下,可配置strip_prefix = "子目录名" 去掉多余路径层级
    build_file_content = """
package(default_visibility = ["//visibility:public"])

# 生成shell启动包装脚本
genrule(
    name = "generate_fantomas_shim",
    outs = ["fantomas_shim.sh"],
    cmd = """
cat > $@ <<'EOF'
#!/usr/bin/env bash
set -euo pipefail
# 下方路径替换为你zip包内实际的可执行文件路径,此处为fantomas nuget包的默认路径
exec dotnet "$$(dirname "$$0")/tools/netcoreapp3.1/any/fantomas.dll" "$$@"
EOF
chmod +x $@
    """,
)

# 封装为sh_binary规则
sh_binary(
    name = "fantomas",
    srcs = [":generate_fantomas_shim"],
    # 将包内所有文件纳入运行时依赖,避免沙箱环境下找不到依赖文件
    data = glob(["**/*"], exclude=["BUILD.bazel", "WORKSPACE", "**/*.pdb"]),
)
""",
)

如果你的工具是独立原生二进制、不需要额外运行时(比如dotnet、jre),只需要修改shim脚本里的exec行,直接调用包内二进制的相对路径即可。

2. 在业务规则中引用封装好的sh_binary

封装完成后,统一通过@fantomas_nuget//:fantomas这个label引用工具,支持在genrule、sh_test、cc_binary等所有需要依赖可执行工具的规则中使用。

genrule使用示例

在你自己项目的BUILD文件中添加如下规则:

genrule(
    name = "format_all_fsharp_files",
    srcs = glob(["src/**/*.fs", "src/**/*.fsi"]),
    outs = ["format_result.stamp"],
    cmd = """
$(location @fantomas_nuget//:fantomas) --recurse $(SRCS)
touch $@
    """,
    # 必须在tools字段声明工具依赖,Bazel才会把工具构建好放到执行路径里
    tools = ["@fantomas_nuget//:fantomas"],
)

sh_test使用示例

sh_test(
    name = "check_code_format",
    srcs = ["check_format.sh"],
    data = [
        "@fantomas_nuget//:fantomas",
        glob(["src/**/*.fs", "src/**/*.fsi"]),
    ],
)

对应的测试脚本check_format.sh内容参考:

#!/usr/bin/env bash
set -euo pipefail
# 直接通过runfiles路径引用封装好的工具
"${RUNFILES_DIR}/fantomas_nuget/fantomas" --check --recurse src/

关键注意点

  • 一定要先手动确认zip包解压后的内部目录结构,把shim脚本里的可执行文件路径替换为实际路径,否则运行时会报文件不存在错误
  • 工具运行依赖的所有文件必须加入sh_binary的data字段,否则Bazel沙箱隔离环境下会找不到依赖
  • 如果不想把BUILD规则内嵌在WORKSPACE里,也可以在项目下新建third_party/fantomas/BUILD.bazel存放上述sh_binary相关配置,然后在http_archive里用build_file = "//third_party/fantomas:BUILD.bazel"替换build_file_content字段即可

内容的提问来源于stack exchange,提问作者sdgfsdh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 21:27:47