注册
web

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",
},

下面是执行效果


Video_2023-06-09_202602.gif


image.png

0 个评论

要回复文章请先登录注册