使用pnpm与tsc时,如何解决依赖改动未被检测的构建问题?
我有一个基于pnpm和tsc的项目,发现未修改源码但改动依赖时,tsc不会触发重新构建,仅修改源码才会执行构建操作。例如执行pnpm install && tsc --build --verbose tsconfig.json能成功编译,但移除effect依赖后,tsc因未检测到依赖变化仍会执行编译,最终导致报错。
示例配置
package.json
{ "name": "@my/lib", "private": true, "version": "1.0.0", "type": "module", "exports": { ".": "./src/index.ts" }, "scripts": { }, "dependencies": { "effect": "3.1.4" } }
src/index.ts
import { Effect } from "effect";
tsconfig.json
{ "extends": "@config/typescript/workspace.json", "compileOnSave": true, "compilerOptions": { "composite": true, "declaration": true, "declarationMap": true }, "include": [ "src" ], "compilerOptions": { "tsBuildInfoFile": ".tsbuildinfo/src.tsbuildinfo", "rootDir": "src", "outDir": "build/src" } }
tsc的增量构建(--build模式)默认仅追踪项目内源码文件和.tsbuildinfo记录的依赖,不会监听package.json或依赖包的变动。可通过以下方式解决:
1. 手动清理构建缓存
每次改动依赖后,删除构建缓存文件和输出目录,强制tsc重新构建:
rm -rf .tsbuildinfo build && tsc --build --verbose tsconfig.json
可以把该命令封装到package.json的scripts中,方便调用:
"scripts": { "build": "rm -rf .tsbuildinfo build && tsc --build --verbose tsconfig.json" }
之后执行pnpm build即可确保依赖变动后触发完整构建。
2. 用工具监听依赖变动
使用第三方工具(如chokidar-cli)监听package.json和node_modules的变动,自动触发重新构建:
首先安装依赖:
pnpm add -D chokidar-cli
然后添加scripts:
"scripts": { "build": "tsc --build --verbose tsconfig.json", "watch": "chokidar 'package.json' 'node_modules' -c 'pnpm build'" }
执行pnpm watch后,当package.json修改或node_modules内包变动时,会自动触发构建。
3. 调整tsconfig纳入package.json检测
在tsconfig的include中添加package.json,让tsc将其纳入构建依赖检查:
"include": [ "src", "package.json" ]
这种方式仅能检测package.json的内容变化(如依赖版本修改),无法直接检测node_modules内实际安装包的变动,建议配合pnpm的--frozen-lockfile使用,确保package.json与锁文件的一致性,让依赖变动体现在package.json的修改上。
内容的提问来源于stack exchange,提问作者Adam A

