如何让Lerna Monorepo直接执行生产环境构建?
Monorepo中优先执行
build:production,不存在则回退到build的解决方案 针对你用Lerna管理的Monorepo场景,不需要重复执行两次构建命令,以下几种方案可以实现按需调用对应脚本:
方案1:自定义Node脚本(推荐,扩展性强)
写一个简单的Node脚本遍历所有包,自动判断执行对应的构建命令,同时利用Lerna处理包依赖顺序:
- 在项目根目录创建
scripts/build-prod.js文件:
const { execSync } = require('child_process'); const fs = require('fs'); const path = require('path'); // 读取Lerna配置中的包列表 const lernaConfig = require('../lerna.json'); const packages = lernaConfig.packages; packages.forEach(pkgGlob => { const pkgPath = path.resolve(__dirname, '../', pkgGlob); const pkgJsonPath = path.join(pkgPath, 'package.json'); if (fs.existsSync(pkgJsonPath)) { const pkgJson = require(pkgJsonPath); const targetScript = pkgJson.scripts?.['build:production'] ? 'build:production' : 'build'; console.log(`[${pkgGlob}] 执行构建脚本: ${targetScript}`); // 用Lerna执行指定脚本,确保依赖包先构建 execSync(`npx lerna run ${targetScript} --scope ${pkgGlob} --stream --include-dependencies`, { stdio: 'inherit' }); } });
- 在根目录
package.json中添加脚本:
"scripts": { "build:prod": "node scripts/build-prod.js" }
- 运行命令:
yarn build:prod,脚本会自动为每个包选择合适的构建命令。
方案2:统一定义build:prod入口脚本
给每个包添加一个统一的build:prod脚本,内部判断执行对应命令:
- 对于
@myorg下的包,修改package.json:
"scripts": { "build:prod": "yarn build:production", "build": "你的普通构建命令", "build:production": "你的生产优化构建命令" }
- 对于其他组织的包,修改
package.json:
"scripts": { "build:prod": "yarn build", "build": "你的普通构建命令" }
- 根目录
package.json添加脚本:
"scripts": { "build:prod": "lerna run build:prod --stream --include-dependencies" }
运行yarn build:prod即可统一触发所有包的生产构建,这种方式适合包数量不多的场景。
方案3:Bash脚本(适合Linux/macOS环境)
如果熟悉Shell脚本,可以用以下方式实现:
- 创建
build-prod.sh文件:
#!/bin/bash # 读取Lerna配置中的包列表(需提前安装jq:brew install jq / apt install jq) PACKAGES=$(jq -r '.packages[]' lerna.json) for pkg in $PACKAGES; do PKG_JSON="./$pkg/package.json" if [ -f "$PKG_JSON" ]; then # 检查是否存在build:production脚本 if jq -e '.scripts["build:production"]' "$PKG_JSON" > /dev/null; then echo "[$pkg] 执行 build:production" npx lerna run build:production --scope "$pkg" --stream --include-dependencies else echo "[$pkg] 执行 build" npx lerna run build --scope "$pkg" --stream --include-dependencies fi fi done
给脚本添加执行权限:
chmod +x build-prod.sh根目录
package.json添加脚本:
"scripts": { "build:prod": "./build-prod.sh" }
关键注意点
- 所有方案都建议加上
--stream参数,实时输出构建日志,方便排查问题。 --include-dependencies参数会让Lerna自动处理包之间的依赖顺序,先构建被依赖的包,避免构建失败。- 方案1的Node脚本扩展性最好,后续如果要添加更多判断逻辑(比如根据包名前缀区分组织),修改起来更灵活。
内容的提问来源于stack exchange,提问作者heapOverflow
相关产品推荐
相关产品推荐

