脚本作用:

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');
}