rigjs
Version:
A multi-repos dev tool based on yarn and git.Rigjs is intended to be the simplest way to develop,share and deliver codes between different developers or different projects.
103 lines (96 loc) • 3.81 kB
text/typescript
import CICD, {Define, FrameworkType} from '@/classes/cicd/CICD';
import CICDCmd from '@/classes/cicd/CICDCmd';
import shell from 'shelljs';
import path from 'path';
import fs from 'fs';
import vueEnv from '../env';
import print from '../print';
const replaceDefine = (target: string, defines?: Define) => {
console.log(`start replaceDefine:${target}`);
const dirs = fs.readdirSync(target);
for (let dir of dirs) {
const stat = fs.statSync(path.join(target, dir));
if (stat.isDirectory()) {
replaceDefine(path.join(target, dir), defines);
} else {
if (defines) {
const namePieces = dir.split('.');
const fileType = namePieces[namePieces.length - 1];
if (['js', 'ts', 'html'].indexOf(fileType) >= 0) {
let file = fs.readFileSync(path.join(target, dir)).toString();
const replaceArr = Object.keys(defines);
for (let replace of replaceArr) {
file = file.replace(new RegExp(replace, 'g'), defines[replace] as string);
}
fs.writeFileSync(path.join(target, dir), file);
}
}
}
}
}
export default async (cmd: any) => {
console.log('start building');
//create cicd object
const cicd = CICD.createByDefault(cmd);
//construct cmd object
const cicdCmd = new CICDCmd(cmd, cicd);
//build by cicdCmd and cicdConfig
if (cicdCmd.endpoints.length === 0) {
throw new Error('Must have validate endpoints')
}
//替换build中的可替换变量
const regexPublicPath = new RegExp('\\$public_path', 'g');
const regexPublicPath2 = new RegExp('__PUBLIC_PATH__', 'g');
const regexPublicPath3 = new RegExp('__RIG_PUBLIC_PATH__', 'g');
const regexDomain = new RegExp('__DOMAIN__', 'g');
const regexDomain2 = new RegExp('__RIG_DOMAIN__', 'g');
const regexOutput = new RegExp('__RIG_OUTPUT_DIR__', 'g');
for (let i = 0; i < cicdCmd.endpoints.length; i++) {
const ep = cicdCmd.endpoints[i];
try {
//替换define中的$public_path
if (ep.defines) {
Object.keys(ep.defines).forEach(key => {
ep.defines[key] = ep.defines[key].replace(regexPublicPath, ep.publicPath);
ep.defines[key] = ep.defines[key].replace(regexPublicPath2, ep.publicPath);
ep.defines[key] = ep.defines[key].replace(regexPublicPath3, ep.publicPath);
ep.defines[key] = ep.defines[key].replace(regexDomain, ep.domains[0]);
ep.defines[key] = ep.defines[key].replace(regexDomain2, ep.domains[0]);
});
}
} catch (e) {
console.log('JSON5 error:', ep.defines, e.message);
}
let frameworktype: FrameworkType | undefined;
//判断是否要生成环境变量文件,以及生成环境变量的操作
if (ep.vue_env) {
frameworktype = FrameworkType.vue;
}
if (!ep.extra_env) ep.extra_env = {};
ep.extra_env['PUBLIC_PATH'] = ep.publicPath;
ep.extra_env['OUTPUT_DIR'] = path.join(cicd.source.root_path, ep.publicPath);
switch (frameworktype) {
case FrameworkType.vue: {
vueEnv.useEnv(ep.vue_env!, ep.extra_env);
//推测vue脚本//TODO:取消推测
if (!ep.build) ep.build = `npx vue-cli-service build --mode rig --dest ${ep.extra_env['OUTPUT_DIR']}`;
}
break;
default:
break;
}
//Replace predefined variables in build script
ep.build = ep.build.replace(regexPublicPath, ep.publicPath);
ep.build = ep.build.replace(regexOutput, path.join(cicd.source.root_path, ep.publicPath));
print.info(`using build script:${ep.build}`);
shell.exec(ep.build);
//setup default defines and replace text in built source.
if (!ep.defines) ep.defines = {};
ep.defines['__PUBLIC_PATH__'] = ep.publicPath;
ep.defines['__DEPLOY_DIR__'] = ep.publicPath;
ep.defines['__RIG_PUBLIC_PATH__'] = ep.publicPath;
ep.defines['__RIG_DEPLOY_DIR__'] = ep.publicPath;
ep.defines['__RIG_ENTRY_PATH__'] = ep.web_entry_path!;
replaceDefine(path.join(cicd.source.root_path, ep.publicPath), ep.defines);
}
}