webpack-papa-script
Version:
A frontend projects solution
240 lines (198 loc) • 6.49 kB
JavaScript
const program = require('commander');
const fs = require('fs');
const path = require('path');
const { build, watch } = require('./build');
const { create } = require('./create');
//const initProj = require('./initProj');
const ftp = require('./ftp');
const test = require('./test');
const serve = require('./serve');
const { getAllProjName } = require('./util/getAllProjName');
const chalk = require('chalk');
const opn = require('opn');
const config = require('./config');
const frontendConf = require('./frontend_conf');
const { deployStaticAll, deployStaticEnvTest } = require('./deployStatic');
const logger = require('./util/logger');
program
.option('s, --serve', '开启服务')
.option(
'w, --watch <活动名>',
'开发一个活动,监听代码实时刷新,并开启服务',
name => config.setTarget(name)
)
.option('r, --release <活动名>', '发布某个活动的代码。默认生产环境', name =>
config.setTarget(name)
)
.option(
'duan <pc或m>',
'pc端or移动端,或者commSingleProjSubPage配置的文件夹名。',
name => config.setDuan(name)
)
.option('ra, --release-all', '发布所有活动。')
.option('u, --upload [活动名]', '上传测试服务器', name =>
config.setTarget(name)
)
.option('open', '打开测试服务器链接')
.option('scope, --scope <文件夹范围>', '发布所有活动的文件夹范围', name =>
config.setBuildAllScope(name)
)
.option('p, --production', '设置为:非开发模式。默认release自带此属性', () =>
config.setEnv('production')
)
.option(
'd, --development',
'设置为:不压缩且包含inline-source-map。默认watch自带此属性',
() => config.setEnv('development')
)
.option(
'mode <环境>',
'设置前端API接口的环境, 只有在测试环境时生效,预发和生产环境无效。',
mode => fFrontEndConf(mode)
)
.option('M, hard-mode <环境>', '强制更改前端API接口', mode =>
fFrontEndConf(mode, 'hard')
)
.option('c, --create <活动名>', '新建一个活动', name =>
setTimeout(() => createAHuodong(name), 0)
)
.option(
't --template <模版名>',
'新建一个活动时,选一个模版',
(name, meno) => (meno = name)
)
.option('deploy-static', '把/resource/static的文件复制到3个环境');
Object.keys(config.deployEnvType).forEach(name => {
program.option(
`${name}, --${name}`,
`发布到${config.releaseEnvDesc[name]}环境`,
() => config.setEnv('production')
);
});
program.parse(process.argv);
// 配置写入process.env的形式
//console.log(chalk.yellow('提示: 假如遇到不清楚的代码报错, 请联系构建工具维护者') );
let _tmp = {};
if (program.serve) {
serve.start();
}
if (program.release) {
// release模式自动切换到生产环境
setReleaseConfig();
//
if (!isCompileProceed()) {
return;
}
frontendConf.promiseSetDone
.then(() => build())
.then(() => program.upload && upload())
.catch(e => console.log(chalk.red(e)));
}
if (program.releaseAll) {
config.setTarget(getAllProjName(config.getConf('buildAllScope')));
setReleaseConfig();
if (!isCompileProceed()) {
return;
}
frontendConf.promiseSetDone
.then(() => build())
.then(() => program.upload && upload())
.catch(e => console.log(chalk.red(e)));
}
// 没有查能不能知道只有一个upload参数,先这么写了。
if (
!program.release &&
!program.releaseAll &&
!program.deployStatic &&
program.upload
) {
upload();
}
if (program.watch) {
if (!isCompileProceed()) {
return;
}
//预设api接口为测试环境
if (!program.mode) {
frontendConf.setFrontEndConf(config.getDevFetchName(), config.getTarget());
}
!program.production && config.setEnv('development');
frontendConf.promiseSetDone
.then(() => watch())
.catch(e => console.log(chalk.red(e)));
// 复制common.js 到build/
deployStaticEnvTest();
}
// 生成common.js
if (program.deployStatic) {
deployStaticAll(!!program.upload);
}
function upload() {
ftp
.uploadToServer({ desc: '活动:' + config.getTarget(), isLog: false })
.then(remoteLink => {
if (program.open) opn(remoteLink, { wait: false });
})
.catch(e => console.error(e));
}
function fFrontEndConf(mode, isHard) {
//不让在非测试环境改
if (program.release && !program[config.getDevDeployName()] && !isHard) {
return console.log(chalk.red('不允许在非测试环境改 ( ._.)'));
/*if (!isHard) {
}*/
}
return frontendConf.setFrontEndConf(mode, config.getTarget());
}
function createAHuodong(name) {
create(name, program.template)
.then(() => console.log(chalk.cyan('活动' + name + '添加成功')))
.catch(err => console.error(chalk.red(err)));
}
function getSettedType() {
return Object.keys(config.getConf('deployEnvType')).filter(name =>
program.hasOwnProperty(name)
)[0] || config.getProDeployName();
}
function setReleaseConfig() {
const target = config.getTarget();
const developEnvType = config.getDevDeployName();
productEnvType = config.getProDeployName();
// 匹配配置文件的环境定义deployEnvType,假如没有匹配到的定义,则使用线上环境
const envType = getSettedType();
//指定是发布到哪个环境
config.setConf('deployType', envType);
//前端接口请求环境定义, hardMode只能在非线上环境修改。
if (!program.hardMode || envType === productEnvType) {
frontendConf.setFrontEndConf(config.deployMapFetchName(envType), target);
}
//非开发环境
if (envType !== developEnvType) {
config.setDuan(config.commSingleProjSubPage);
}
}
function isCompileProceed() {
const shouldCompileProceed = config.shouldCompileProceed;
const isDev = config.getDevDeployName() === getSettedType();
const dir = config.getTarget().map(tar=> path.join(process.cwd(), 'src', tar));
if (program.watch || isDev) {
if (
shouldCompileProceed.development && shouldCompileProceed.development(dir)===false
) {
logger.red('代码检查不通过,终止执行。');
return false;
}else{
return true;
}
}else{
if (
shouldCompileProceed.production && shouldCompileProceed.production(dir)===false
) {
logger.red('代码检查不通过,终止执行。');
return false;
}else{
return true;
}
}
}