如何编写Bazel规则实现TS格式OpenAPI Schema转YAML文件
问题1:是否可以使用ts_library,将其输出传递给该Bazel规则?
可以,实现逻辑如下:
- 服务侧先为
openapi.schema.ts文件声明ts_library规则,要正确声明该schema文件依赖的所有其他TS文件、第三方npm依赖作为deps,确保编译输出完整可用的JS产物。 - 你的
generate_yaml_from_ts规则将该ts_library的target作为输入,把其编译输出的JS文件全部加入执行时的runfiles。 - 规则内部的Node执行脚本直接导入编译后的JS schema对象即可,不需要再处理TS编译逻辑。
这种方案的劣势是需要每个接入的服务侧额外维护一套schema对应的ts_library配置,接入成本更高。
问题2:是否可以直接从服务侧传入TS文件,在规则内完成编译并执行逻辑?
可以,这也是更推荐的方案,能极大降低用户侧的接入成本,只需要传入schema文件路径即可,实现逻辑如下:
- 你的规则需要声明依赖rules_nodejs工具链以及ts-node、yaml等必要的npm依赖,提前把这些依赖封装在规则内部,不需要用户额外配置。
- 规则内部自动收集传入的schema文件以及它的所有传递TS依赖(可以通过Bazel的传递源文件收集能力,或者直接用
js_run_binary/ts_project内置的依赖解析逻辑实现),确保所有相关TS文件都在执行时可见。 - 执行阶段直接用ts-node运行你的YAML生成逻辑脚本,ts-node会自动完成TS的实时编译,不需要提前做预编译步骤,直接读入schema对象输出YAML即可。
- 额外可以做的优化:给规则添加
deps参数,如果用户的schema依赖了其他内部TS库或者npm包,可以通过该参数传入,规则自动把这些依赖加入runfiles。
内容的提问来源于stack exchange,提问作者Susitha Ravinda Senarath
相关产品推荐
相关产品推荐

