使用lerna watch时如何忽略dist文件以避免循环构建?
解决Lerna Watch构建循环问题(忽略dist目录)
方法1:给Lerna Watch配置忽略规则
这是最直接的方案,你可以通过两种方式设置忽略dist目录:
- 命令行直接指定:运行watch命令时加上
--ignore参数,比如:lerna watch --ignore '**/dist/**' -- npm run build - 配置文件持久化设置:在项目根目录的
lerna.json中添加watch配置,以后运行lerna watch就自动生效:{ "version": "independent", "watch": { "ignore": ["**/dist/**"] } }
这样Lerna就不会监听dist目录下的任何文件变更,构建产物生成后不会触发新一轮构建。
方法2:调整构建产物的输出路径
如果项目允许,你可以把每个package的dist目录移到monorepo根目录下,比如输出到../dist/[package-name],这样构建产物不在package自身目录内,自然不会被Lerna的watch机制捕获。
比如用TypeScript的话,修改每个package的tsconfig.json:
{ "compilerOptions": { "outDir": "../../dist/my-package" } }
方法3:自定义watch逻辑(进阶)
如果上面的方案都不适用,你可以放弃Lerna自带的watch,用chokidar这类工具自己实现监听逻辑,只监听源码目录(比如src/**/*),当源码变更时再触发构建命令。
比如在根目录写个简单的脚本watch.js:
const chokidar = require('chokidar'); const { execSync } = require('child_process'); // 监听所有package的src目录 const watcher = chokidar.watch('packages/**/src/**/*', { ignoreInitial: true }); watcher.on('change', (path) => { // 找到对应的package目录 const pkgDir = path.split('/src')[0]; console.log(`Building ${pkgDir}...`); execSync('npm run build', { cwd: pkgDir, stdio: 'inherit' }); });
然后运行node watch.js即可,完全自定义监听范围,从根源避免循环触发。
内容的提问来源于stack exchange,提问作者Alexis Leite Paracampo
相关产品推荐
相关产品推荐

