脚本作用:
vite+vue3项目,为了支持多分支同时部署到一个实例,将env文件里的VITE_PUBLIC_PATH = /xxx/ 替换为 `VITE_PUBLIC_PATH = /xxx/${分支名}/
注意
会碰到替换、插入换行符,但是windows和linux的换行符不一样,这里使用os.EOL可以确保替换不出错
/**
* 将env文件里的`VITE_PUBLIC_PATH = /xxx/` 替换为 `VITE_PUBLIC_PATH = /xxx/${分支名}/`
* 只在开发和测试环境运行
*/
const fs = require('fs');
const path = require('path');
const os = require('os');
// 获取当前git分支名;`CI_COMMIT_REF_NAME`是gitlab专用的环境变量,用于获取当前ci的分支名
const branchName = process.env.CI_COMMIT_REF_NAME;
// 白名单里的分支不触发此变更
const whiteList = ['develop', 'release', 'master', '', undefined];
// 如果触发分支不在白名单,重写VITE_PUBLIC_PATH的值
// 如: 将/client/ 重写为 /client/develop-branch1/
if (!whiteList.includes(branchName)) {
console.log(`当前CI分支${branchName},VITE_PUBLIC_PATH参数注入分支名...`);
injectBranchName('.env', branchName);
injectBranchName('.env.dev', branchName);
injectBranchName('.env.test', branchName);
} else {
console.log(`当前CI分支${branchName},无需修改VITE_PUBLIC_PATH`);
}
// 去除注释
function clearComment(str) {
return str.split('#')[0].trim();
}
// 去除首尾斜杠
function clearSlash(str) {
return str.replace(/(^\/*)|(\/*$)/g, '');
}
/**
* 将env文件里的`VITE_PUBLIC_PATH = /xxx/` 替换为 `VITE_PUBLIC_PATH = /xxx/${分支名}/`
* @param {*} envPathName .env,.env.dev,.env.test
* @param {*} branchName
*/
function injectBranchName(envPathName = '.env', branchName) {
const envPath = path.join(process.cwd(), envPathName);
const dataList = fs.readFileSync(envPath, 'utf-8').split(os.EOL);
const targetIndex = dataList.findIndex((v) => v.startsWith('VITE_PUBLIC_PATH'));
if (targetIndex < 0) {
console.log(envPath, '无VITE_PUBLIC_PATH参数');
return;
}
// 原始 VITE_PUBLIC_PATH 配置,是一整行字符串
const publicPathOriginStr = clearComment(dataList[targetIndex]);
// 获取VITE_PUBLIC_PATH的值 eg. /client/
const publicPath = publicPathOriginStr.split('=')[1].trim();
// 改造VITE_PUBLIC_PATH的值 eg. /client/develop-branch1/
const pathWithBranchName = `/${clearSlash(publicPath)}/${branchName}/`;
// 构造新的一整行字符串
const resultStr = publicPathOriginStr.replace(publicPath, pathWithBranchName);
dataList[targetIndex] = resultStr;
console.log(envPath, '已修改', resultStr);
// 重写文件
fs.writeFileSync(envPath, dataList.join(os.EOL), 'utf-8');
}