fws
Version:
Fws is a workflow management tool that focuses on global automation tasks.
151 lines (126 loc) • 5.88 kB
JavaScript
;
const {fs,path,cwdPath,program,tip,pathInfo,getType,fwsConfig,npmPackage,getLocalIp} = {
fs:require('fs'),
path:require('path'),
cwdPath:process.cwd(), //当前路径
program:require('commander'),
tip:require('./lib/tip'), //文字提示
pathInfo:require('./lib/getPathInfo'), //获取目标路径的相关信息
getType:require('./lib/getType'), //获取数据类型
fwsConfig:require('./config'),
npmPackage:require('./package.json'),
getLocalIp:require('./lib/getLocalIp') //获取本机ip地址
};
//字符串方法扩展
String.prototype.replaceAll = function(substr,replacement){
let re = /\*|\.|\?|\+|\$|\^|\[|\]|\(|\)|\{|\}|\||\\|\//g,
newReS = substr.replace(re,(item,index)=>{
return '\\'+item;
}),
newRe = new RegExp(newReS,'g');
return this.replace(newRe,replacement);
};
//声明版本号
program.version(npmPackage.version);
//定义全局
global.fws = {
'fwsPath':path.join(__dirname,path.sep), //fws目录路径
'taskPath':path.join(__dirname,'task'+path.sep), //任务插件路径
'tplPath':path.join(__dirname,'tpl'+path.sep), //内置tpl目录
'tplConfigPath':path.join(__dirname,'tpl','_config'+path.sep), //内置tpl配置目录
'cmdPath':cwdPath, //当前进程所在的目录
'srcPath':path.join(cwdPath,'src'+path.sep), //当前进程下的src目录
'devPath':path.join(cwdPath,'dev'+path.sep), //当前进程下的dev目录
'distPath':path.join(cwdPath,'dist'+path.sep), //当前进程下的dist目录
'config':fwsConfig,
'require':(module)=>{ //引入模块并且不缓存
delete require.cache[require.resolve(module)];
return require(module);
},
'globalReplace':{
'$$localhost':getLocalIp()
},
'cache':{} //文件编译缓存
};
global.fws_spriteTime ={}; //用于保存精灵图目录编译时间
fws.config.update_author = fwsConfig.author;
fws.config.update_mail = fwsConfig.mail;
//项目配置信息覆盖fws信息
let fwsConfigPath = path.join(cwdPath,'fws_config.js');
if(pathInfo(fwsConfigPath).type === 'file'){
let fwsConfigData = require(fwsConfigPath);
for(let i in fwsConfigData){
fws.config[i] = fwsConfigData[i];
};
};
//检查任务目录是否存在,如果有则注册所有任务
if(pathInfo(path.join(__dirname,'/task')).type === 'dir'){
let taskDirList = fs.readdirSync(fws.taskPath),
task = {},
taskList = [];
//获取任务目录下的所有.js文件
taskDirList.forEach((item,index)=>{
if(path.extname(item).toLowerCase() === '.js'){
taskList.push(item);
};
});
for(let index=0,len = taskList.length; index<len; index++){
let item = taskList[index],
taskFile = path.join(fws.taskPath,item),
extName = path.extname(taskFile), //得到文件扩展名
fileName = path.basename(taskFile,extName), //得到文件名,不包括扩展名部分的
taskContent = require(taskFile).regTask; //得到任务注册相关参数
//检查是否有注册任务
if(taskContent){
//任务主参数接收
if(taskContent.command && getType(taskContent.command) === 'string'){
task[fileName] = program.command(`${fileName} ${taskContent.command}`);
}else{
tip.error(`任务 "${taskFile}" regTask.command 无效`);
continue;
};
//任务描述添加
if(taskContent.description && getType(taskContent.description) === 'string'){
task[fileName].description(taskContent.description);
};
//任务参数绑定
if(taskContent.option && getType(taskContent.option) === 'array'){
taskContent.option.forEach((item,index)=>{
task[fileName].option.apply(task[fileName],item);
});
};
//任务方法绑定
if(taskContent.action && getType(taskContent.action) === 'function'){
task[fileName].action((name,options)=>{
let task = new taskContent.action(name,options);
task.init();
});
}else{
tip.error(`任务 "${taskFile}" regTask.action 必须是一个函数`);
};
//任务帮助说明处理
if(taskContent.help && getType(taskContent.help) === 'function'){
task[fileName].on('--help',(...arg)=>{
taskContent.help(arg);
});
};
}else{
tip.error(`"${taskFile}" 不是一个有效的任务插件,请检查插件暴露参数。`);
};
};
}else{
tip.error(`任务目录 ${fws.taskPath} 好像不存在,请检查……`);
};
//添加额外的帮助信息
program.on('--help',()=>{
console.log(` 意见反馈:`);
console.log(` ------------------------------------------------------------`);
console.log(' @单炒饭 https://github.com/sbfkcel/fws/wiki');
});
//解析命令行参数argv
program.parse(process.argv);
//当没有传入参数时,输出帮助信息
if (!process.argv.splice(2).length) {
program.outputHelp();
};