如何为TypeScript复合项目的tsc --build命令添加自定义构建步骤
针对TypeScript复合项目
tsc --build插入自定义钩子的可行方案 是可以实现的,目前有三类落地性较强的方案,可以根据你的monorepo技术栈选择:
方案1:无额外依赖的原生包装方案
这个方案不需要引入新的工具,完全基于现有npm脚本和tsc能力实现:
- 首先在所有需要执行Joi转TypeScript步骤的子项目package.json中,新增
prebuild脚本,写入你现有的Joi schema转换命令,比如joi-to-typescript -s ./src/schemas -o ./src/generated-types - 在monorepo根目录编写一个轻量的包装脚本,逻辑如下:
- 解析根目录
tsconfig.json中的references字段,获取所有被引用的子项目路径 - 遍历所有子项目,检查是否存在
prebuild脚本,存在则执行 - 所有前置脚本执行完成后,调用原生的
tsc --build命令完成编译
- 解析根目录
- 如果只需要给部分项目加钩子,只要不给不需要转换的项目加
prebuild脚本即可,遍历逻辑会自动跳过。
方案2:基于monorepo任务编排工具实现
如果你已经在使用pnpm、TurboRepo、Nx这类monorepo管理工具,可以直接用其任务调度能力替代原生tsc --build的依赖调度,天然支持自定义钩子:
- 每个子项目的
build脚本配置为先执行Joi转类型命令,再执行tsc -b(单项目编译命令) - 在根目录配置工具的任务依赖规则,要求每个项目的
build任务必须等待其所有依赖项的build任务执行完成后再运行 - 执行根目录的全局build命令时,工具会自动按照依赖顺序构建所有项目,和原生
tsc --build的调度逻辑完全一致,还自带增量构建、缓存等能力,构建效率更高。
方案3:基于TypeScript API自定义编译流程
如果不想调整现有任务结构,也可以直接通过TypeScript暴露的API自定义编译流程,插入钩子:
- 编写自定义脚本调用TypeScript的
createProgramAPI,在初始化编译实例之前,先执行对应子项目的Joi转类型逻辑,再走正常的编译流程 - 也可以直接使用
tsc-watch这类包装工具的钩子配置,如果同时需要监听文件变更增量构建会更方便。
注意事项
- 转换生成的TypeScript类型文件需要加入对应子项目
tsconfig.json的include数组中,避免编译时报找不到类型的错误 - 可以在Joi转换逻辑中加入文件修改时间判断,schema文件没有变更时跳过转换步骤,提升构建速度。
内容的提问来源于stack exchange,提问作者shennan
相关产品推荐
相关产品推荐

