vue打包脚本:打包前判定某个npm link依赖库是否是指定分支
1. 需求场景
- 有一个
项目A
,它依赖项目B
项目B
是本地开发的,也在本地维护项目A
通过npm link
链接到了项目B
- 随着
项目A
的不断迭代,功能升级较大创建了新的分支项目A-dev
项目A-dev
分支也要求项目B
也要创建出项目B-dev
分支与之对应项目A
和项目A-dev
都在产品同时运行,遇到问题都要在各自分支同步修复缺陷
在启动或者打包的时候需要特别小心项目B
处在什么分支,错配分支就会导致项目启动失败或报错,于是需要有一个脚本帮我在项目启动时,检查依赖脚本是否在正确的分支上,如果不在,就自动将依赖分支切换到对应需要的分支上。
2. 脚本编写
2.1 脚本思路:
- 先去指定
项目B
的文件夹中查看该项目处于哪一个分支 - 通过动态参数获得本地启动或打包的是哪一个分支,和当前项目分支进行比对
- 如果不是当前分支,就切换到要求的分支, 切到对应分支后,再执行
install
操作 - 如果是当前分支则直接跳过分支切换操作,直接往下走
2.2 脚本创建
在vue项目根目录创建一个脚本文件check-dependency.js
下面脚本中分支名@tiamaes/t4-framework
就对应项目B
const t4FrameworkFilePath = "D:/leehoo/t4-framework"; //本地@tiamaes/t4-framework目录地址
const { spawnSync } = require("child_process");
const branchName = process.argv[2];//获取参数分支名,打包时需要传递进来
if (!branchName) {
console.error("Branch name is not specified.");
process.exit(1);
}
// 获取当前分支
const result = spawnSync("git", ["rev-parse", "--abbrev-ref", "HEAD"], { cwd: t4FrameworkFilePath });
if (result.status !== 0) {
console.error("Failed to get current branch:", result.stderr.toString());
process.exit(1);
}
const currentBranch = result.stdout.toString().trim();
// 判断分支是否需要切换
if (currentBranch !== branchName) {
console.log(`@tiamaes/t4-framework is not in ${branchName} branch. Switching to ${branchName} branch...`);
const checkoutResult = spawnSync("git", ["checkout", branchName], { cwd: t4FrameworkFilePath });
if (checkoutResult.status !== 0) {
console.error(`Failed to switch to ${branchName} branch:`, checkoutResult.stderr.toString());
process.exit(1);
}
// 安装依赖包
console.log("Installing dependencies...");
const installResult = spawnSync(process.platform === "win32" ? "npm.cmd" : "npm", ["install"], { cwd: t4FrameworkFilePath });
if (installResult.status !== 0) {
console.error("Failed to install dependencies:", installResult.stderr.toString());
process.exit(1);
}
console.log("Dependencies installed successfully.");
}
console.log(`@tiamaes/t4-framework is in ${branchName} branch. Proceeding to build...`);
process.exit(0);
3. package.json引用
在该脚本的script中增加引用方式,在项目启动或打包的时候都要执行一次node check-dependency.js
,其后跟随的是项目B
的分支名,我这里是erp-dev和erp-m1两个分支
"scripts": {
"serve:erp": "node check-dependency.js erp-dev && npm run link:local && vue-cli-service serve --mode development.erp",
"serve:m1": "node check-dependency.js erp-m1 && npm run link:local && vue-cli-service serve --mode development.m1",
"build:erp": "node check-dependency.js erp-dev && npm run link:local && vue-cli-service build --report --mode production.erp",
"build:m1": "node check-dependency.js erp-m1 && npm run link:local && vue-cli-service build --mode production.m1",
"link:local": "npm link @tiamaes/t4-framework",
},
下面是执行效果