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

在Bazel中手动用SWC编译TS无输出的问题求助

Bazel手动调用SWC编译TS无输出文件的解决方法

问题分析

你当前的配置仅向SWC传递了源文件路径,但SWC默认会尝试在源文件所在目录输出编译结果——而Bazel的沙盒环境中,源文件目录是只读的,无法写入新文件。这就导致虽然SWC日志显示编译成功,但实际没有生成Bazel声明的outs文件,最终触发"output {file} was not created"错误。

解决方案

需要显式为每个TS文件指定对应的输出路径,让SWC将编译结果写入Bazel管理的输出目录(bazel-out)。核心是通过--out-file参数,将每个源文件映射到你声明的outs列表中的目标文件。

修改后的BUILD配置

load("@npm//@swc/cli:index.bzl", "swc")

SRC_FILES = glob(["**/*.ts"])
OUT_FILES = [s.replace(".ts", ".js") for s in SRC_FILES]

swc(
    name = "compile_ts",
    outs = OUT_FILES,
    args = [
        item
        for src, out in zip(SRC_FILES, OUT_FILES)
        for item in [
            "$(location %s)" % src,
            "--out-file",
            "$(location %s)" % out,
            # 可选:禁用自动加载SWC配置文件,若项目无swc.config.js则建议添加
            "--no-swcrc",
            # 可选:指定编译目标环境,例如ES2020
            "--target", "es2020",
        ]
    ],
    data = SRC_FILES,
)

关键调整说明

  • 配对源文件与输出文件:通过zip将每个TS源文件和对应的JS输出文件绑定,确保SWC精准输出到Bazel期望的路径。
  • 指定输出路径:使用--out-file $(location {out.js})让SWC直接写入Bazel的输出目录(bazel-out下的对应位置),该路径由Bazel自动解析,保证文件可被后续规则读取。
  • 配置文件处理:如果项目有自定义swc.config.js,将其加入data列表,并把--no-swcrc替换为--config-file $(location swc.config.js)。

验证结果

重新执行编译命令后,Bazel会在bazel-out目录下生成对应的JS文件,这些文件可以直接作为其他Bazel规则(如js_library)的输入使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 07:48:27