You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Lerna Monorepo直接执行生产环境构建?

Monorepo中优先执行build:production,不存在则回退到build的解决方案

针对你用Lerna管理的Monorepo场景,不需要重复执行两次构建命令,以下几种方案可以实现按需调用对应脚本:

方案1:自定义Node脚本(推荐,扩展性强)

写一个简单的Node脚本遍历所有包,自动判断执行对应的构建命令,同时利用Lerna处理包依赖顺序:

  1. 在项目根目录创建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'
    });
  }
});
  1. 在根目录package.json中添加脚本:
"scripts": {
  "build:prod": "node scripts/build-prod.js"
}
  1. 运行命令: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脚本,可以用以下方式实现:

  1. 创建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
  1. 给脚本添加执行权限:chmod +x build-prod.sh

  2. 根目录package.json添加脚本:

"scripts": {
  "build:prod": "./build-prod.sh"
}

关键注意点

  • 所有方案都建议加上--stream参数,实时输出构建日志,方便排查问题。
  • --include-dependencies参数会让Lerna自动处理包之间的依赖顺序,先构建被依赖的包,避免构建失败。
  • 方案1的Node脚本扩展性最好,后续如果要添加更多判断逻辑(比如根据包名前缀区分组织),修改起来更灵活。

内容的提问来源于stack exchange,提问作者heapOverflow

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 02:10:30