如何拆分并管理单个package.json中的多Angular项目构建命令?
解决方案
步骤1:创建独立的构建命令配置文件
在项目根目录新建build-configs.json,将所有项目的构建规则结构化存储,按项目分组管理不同环境的配置:
{ "projects": { "project1": { "tenant1": { "command": "ng build --project=project1 -c=tenant1-dev --watch=true" }, "tenant2": { "command": "ng build --project=project1 -c=tenant2-dev --watch=true" }, "tenant3": { "command": "ng build --project=project1 -c=tenant3-dev --watch=true" }, "tenant1-ci": { "command": "ng build --project=project1 -c=tenant1-ci" }, "tenant2-ci": { "command": "ng build --project=project1 -c=tenant2-ci" }, "tenant3-ci": { "command": "ng build --project=project1 -c=tenant3-ci" }, "test": { "command": "ng build --project=project1 -c=tenant1 --watch=true" } }, "project38": { "tenant1": { "command": "ng build --project=project38 -c=tenant1-dev --watch=true" }, "tenant2": { "command": "ng build --project=project38 -c=tenant2-dev --watch=true" }, "tenant3": { "command": "ng build --project=project38 -c=tenant3-dev --watch=true" }, "tenant1-ci": { "command": "ng build --project=project38 -c=tenant1-ci" }, "tenant2-ci": { "command": "ng build --project=project38 -c=tenant2-ci" }, "tenant3-ci": { "command": "ng build --project=project38 -c=tenant3-ci" }, "test": { "command": "ng build --project=project38 -c=tenant1 --watch=true" } } } }
步骤2:编写Node.js执行脚本
新建run-build.js,负责读取配置文件、解析命令行参数并执行对应构建命令:
const fs = require('fs'); const { execSync } = require('child_process'); // 读取构建配置 const config = JSON.parse(fs.readFileSync('./build-configs.json', 'utf8')); // 获取命令行传入的项目名和环境标识 const [project, env] = process.argv.slice(2); // 参数校验 if (!project || !env) { console.error('请按格式执行:npm run build <项目名> <环境标识>'); console.error('示例:npm run build project1 tenant1'); process.exit(1); } // 匹配目标构建命令 const targetCommand = config.projects[project]?.[env]?.command; if (!targetCommand) { console.error(`未找到项目${project}的${env}环境构建配置`); process.exit(1); } // 执行构建命令 try { execSync(targetCommand, { stdio: 'inherit' }); } catch (err) { console.error('构建失败:', err.message); process.exit(1); }
步骤3:简化package.json的scripts
替换原有240+条脚本,只保留一条通用构建命令:
{ "name": "myangular project", "version": "1.0.0", "scripts": { "build": "node run-build.js" }, "private": true, "devDependencies": {}, "dependencies": {} }
步骤4:执行构建命令
现在只需通过以下格式即可执行任意项目的构建:
npm run build project1 tenant1 npm run build project38 tenant2-ci npm run build project1 test
可选优化:添加命令补全
如果使用bash/zsh终端,可添加补全脚本提升操作效率。新建build-completion.sh:
_build_completion() { local config=$(cat ./build-configs.json) local projects=$(echo "$config" | jq -r '.projects | keys[]') local cur=${COMP_WORDS[COMP_CWORD]} local prev=${COMP_WORDS[COMP_CWORD-1]} if [ $COMP_CWORD -eq 2 ]; then COMPREPLY=($(compgen -W "$projects" -- "$cur")) elif [ $COMP_CWORD -eq 3 ]; then local envs=$(echo "$config" | jq -r ".projects.$prev | keys[]") COMPREPLY=($(compgen -W "$envs" -- "$cur")) fi } complete -F _build_completion npm
将脚本路径添加到shell配置文件(~/.bashrc或~/.zshrc)中,即可在输入npm run build 后按Tab键补全项目名和环境标识。
内容的提问来源于stack exchange,提问作者Mona
相关产品推荐
相关产品推荐

