UNPKG

5.88 kBJavaScriptView Raw
1#!/usr/bin/env node
2'use strict';
3const {fs,path,cwdPath,program,tip,pathInfo,getType,fwsConfig,npmPackage,getLocalIp} = {
4 fs:require('fs'),
5 path:require('path'),
6 cwdPath:process.cwd(), //当前路径
7 program:require('commander'),
8 tip:require('./lib/tip'), //文字提示
9 pathInfo:require('./lib/getPathInfo'), //获取目标路径的相关信息
10 getType:require('./lib/getType'), //获取数据类型
11 fwsConfig:require('./config'),
12 npmPackage:require('./package.json'),
13 getLocalIp:require('./lib/getLocalIp') //获取本机ip地址
14};
15
16//字符串方法扩展
17String.prototype.replaceAll = function(substr,replacement){
18 let re = /\*|\.|\?|\+|\$|\^|\[|\]|\(|\)|\{|\}|\||\\|\//g,
19 newReS = substr.replace(re,(item,index)=>{
20 return '\\'+item;
21 }),
22 newRe = new RegExp(newReS,'g');
23 return this.replace(newRe,replacement);
24};
25
26
27//声明版本号
28program.version(npmPackage.version);
29
30//定义全局
31global.fws = {
32 'fwsPath':path.join(__dirname,path.sep), //fws目录路径
33 'taskPath':path.join(__dirname,'task'+path.sep), //任务插件路径
34 'tplPath':path.join(__dirname,'tpl'+path.sep), //内置tpl目录
35 'tplConfigPath':path.join(__dirname,'tpl','_config'+path.sep), //内置tpl配置目录
36 'cmdPath':cwdPath, //当前进程所在的目录
37 'srcPath':path.join(cwdPath,'src'+path.sep), //当前进程下的src目录
38 'devPath':path.join(cwdPath,'dev'+path.sep), //当前进程下的dev目录
39 'distPath':path.join(cwdPath,'dist'+path.sep), //当前进程下的dist目录
40 'config':fwsConfig,
41 'require':(module)=>{ //引入模块并且不缓存
42 delete require.cache[require.resolve(module)];
43 return require(module);
44 },
45 'globalReplace':{
46 '$$localhost':getLocalIp()
47 },
48 'cache':{} //文件编译缓存
49};
50
51global.fws_spriteTime ={}; //用于保存精灵图目录编译时间
52
53
54fws.config.update_author = fwsConfig.author;
55fws.config.update_mail = fwsConfig.mail;
56
57//项目配置信息覆盖fws信息
58let fwsConfigPath = path.join(cwdPath,'fws_config.js');
59if(pathInfo(fwsConfigPath).type === 'file'){
60 let fwsConfigData = require(fwsConfigPath);
61 for(let i in fwsConfigData){
62 fws.config[i] = fwsConfigData[i];
63 };
64};
65
66
67//检查任务目录是否存在,如果有则注册所有任务
68if(pathInfo(path.join(__dirname,'/task')).type === 'dir'){
69 let taskDirList = fs.readdirSync(fws.taskPath),
70 task = {},
71 taskList = [];
72
73 //获取任务目录下的所有.js文件
74 taskDirList.forEach((item,index)=>{
75 if(path.extname(item).toLowerCase() === '.js'){
76 taskList.push(item);
77 };
78 });
79
80 for(let index=0,len = taskList.length; index<len; index++){
81 let item = taskList[index],
82 taskFile = path.join(fws.taskPath,item),
83 extName = path.extname(taskFile), //得到文件扩展名
84 fileName = path.basename(taskFile,extName), //得到文件名,不包括扩展名部分的
85 taskContent = require(taskFile).regTask; //得到任务注册相关参数
86
87 //检查是否有注册任务
88 if(taskContent){
89 //任务主参数接收
90 if(taskContent.command && getType(taskContent.command) === 'string'){
91 task[fileName] = program.command(`${fileName} ${taskContent.command}`);
92 }else{
93 tip.error(`任务 "${taskFile}" regTask.command 无效`);
94 continue;
95 };
96
97 //任务描述添加
98 if(taskContent.description && getType(taskContent.description) === 'string'){
99 task[fileName].description(taskContent.description);
100 };
101
102 //任务参数绑定
103 if(taskContent.option && getType(taskContent.option) === 'array'){
104 taskContent.option.forEach((item,index)=>{
105 task[fileName].option.apply(task[fileName],item);
106 });
107 };
108
109 //任务方法绑定
110 if(taskContent.action && getType(taskContent.action) === 'function'){
111 task[fileName].action((name,options)=>{
112 let task = new taskContent.action(name,options);
113 task.init();
114 });
115 }else{
116 tip.error(`任务 "${taskFile}" regTask.action 必须是一个函数`);
117 };
118
119 //任务帮助说明处理
120 if(taskContent.help && getType(taskContent.help) === 'function'){
121 task[fileName].on('--help',(...arg)=>{
122 taskContent.help(arg);
123 });
124 };
125
126 }else{
127 tip.error(`"${taskFile}" 不是一个有效的任务插件,请检查插件暴露参数。`);
128 };
129
130 };
131
132}else{
133 tip.error(`任务目录 ${fws.taskPath} 好像不存在,请检查……`);
134};
135
136
137//添加额外的帮助信息
138program.on('--help',()=>{
139 console.log(` 意见反馈:`);
140 console.log(` ------------------------------------------------------------`);
141 console.log(' @单炒饭 https://github.com/sbfkcel/fws/wiki');
142});
143
144//解析命令行参数argv
145program.parse(process.argv);
146
147//当没有传入参数时,输出帮助信息
148if (!process.argv.splice(2).length) {
149 program.outputHelp();
150};