在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
相关产品推荐
相关产品推荐

