前语
跟着node的盛行,JS已能够处理大部份题目。这对前端工程师非常友爱。
置信许多同砚在开辟营业之余,都邑写一些小剧本替代手工完成烦琐,反复的事情,从而进步事情效力。
但部份同砚开辟的剧本,仅范围于剧本地点途径,经由历程node xxx 去运转顺序,这范围了剧本的应用范围和应用便利性。
本文就给人人引见一个简朴且一劳永逸的要领,把自身开辟的node剧本布置在全局环境。让剧本能够像Linux敕令一样,全局便利地应用,今后翻开新世界的大门。
全局剧本设置的实质思绪
实在道理很简朴:将Linux的全局敕令搜刮途径,加上剧本地点文件夹的途径。
详细设置历程
找到终端设置文件
- 终端设置文件默许途径为「/User/用户名」,笔者的mac用户名为Momo,故以下示例顶用户名均为「Momo」。
- 原配终端为bash,对应设置文件为「.bash.rc」。装了zsh终端的同砚,对应修正「.zsh.rc」。
- 剖析:.rc文件为终端的设置文件,在重启终端,或许新开终端tab都邑读取该文件。
修正Linux的全局敕令搜刮途径
- 翻开文件,加上剧本地点文件夹。笔者的剧本均放在了myShell(实在应当叫myScript)文件夹中,所以加上一句
export PATH=/Users/Momo/myShell:$PATH
- 剖析:在Linux中,全局敕令搜刮途径就是经由历程PATH变量保存起来的。「:」是字符串链接符的意义。类似于js中,var str = ‘1’ + ‘2’;中的「+」
修正js剧本文件
- 在头部加上
#!/usr/bin/env node
,'use strict';
。 - 剖析:
#!/usr/bin/env node
是指本剧本是经由历程「/usr/bin/env」途径下的node软件运转。相当于文件中什么软件翻开。'use strict';
是指应用js的严厉语法。 - 注重这两句一定要安排为js文件顶部,不然体系将不晓得用什么软件实行。运转失利
修正js剧本文件权限
- 终端运转
chmod 777 剧本文件名
,如示例chmod 777 mop
- 剖析:chmod是linux下修正文件权限的东西,777代表一切读写权限。详细的百度chmod即可。权限设置了今后,剧本的图标将变成下面这个模样。
重启或新建终端,实行剧本。
- 剖析:重启或新建终端是为了读取到刚修正的终端设置文件,让Linux的全局敕令搜刮途径见效。遍历到我们所开辟的剧本。
剧本经常使用功用
设置差别色彩的console.log
- 引见:差别色彩的log除了雅观,还能够起到警示的作用。
基础用法:
// colors不是Node自带模块,须要事前npm install colors装置 const colors = require('colors'); // 援用colors模块,经常使用色彩 black,red,green,yellow,blue,magenta,cyan,white,gray,grey console.log(colors.red('filePath or targetPath can not be empty!')); // 在掌握台输出赤色的案牍
猎取终端地点目次途径
- 引见:如题所示,猎取终端当前地点目次,而不是剧本地点途径
- 基础用法:
let basePath = process.cwd(); // 个中process是node全局变量,供应当前 Node 历程的信息
照顾参数运转剧本
- 引见:日常平凡我们应用linux敕令都邑陪伴一些参数,那末在node中怎样完成,怎样猎取运转时照顾的参数呢?经由历程process.argv即可,它将返回一个数组,由敕令行实行剧本时的各个参数构成。它的第一个成员老是node,第二个成员是剧本文件名,其他成员是剧本文件的参数。
基础用法:
let elem1 = process.argv[2]; // 照顾的参数一 let elem2 = process.argv[3]; // 照顾的参数二
挪用linux敕令
- 引见:有时候我们须要的功用并非仅靠node就可以完成的,还须要linux敕令做支撑。那怎样经由历程node挪用Linux敕令呢?
基础用法:
const child_process = require('child_process'); // child_process是node担任子历程的模块 child_process.exec('ls -a', function (error, stdout, stderr) { // 经由历程child_process下的exec函数实行linux敕令 error && console.log('error ' + error); // 实行失足时的毛病信息 console.log('Child Process STDOUT: ' + stdout); // stdout是实行linux敕令后的实行 效果。在这里即返回实行ls -a敕令遍历到的文件信息 });
翻开页面
- 引见:怎样经由历程Node用浏览器翻开特定页面呢?mac自带了open敕令,我们经由历程node挪用open敕令翻开页面即可。
基础用法:
require('child_process').exec(`open http://baidu.com`); // 翻开百度
// 这是网上找到的,兼容各运转环境的翻开页面要领 let cmd = ''; // 运转的指令 if (process.platform == 'wind32') { cmd = 'start "%ProgramFiles%\Internet Explorer\iexplore.exe"'; } else if (process.platform == 'linux') { cmd = 'xdg-open'; } else if (process.platform == 'darwin') { cmd = 'open'; } require('child_process').exec(`${cmd} http://baidu.com`);
照顾上下文实行linux敕令
引见:上面引见到的挪用linux要领,实质上只是直接去挪用详细的Linux敕令。如挪用ls,相当于直接找到体系内里ls这个剧本,实行它。
这和我们平常在终端内里实行有什么区别呢?
在终端内里,我们挪用敕令是照顾上下文的。即第二条敕令会在实行完第一条敕令以后的环境下实行,比方cd / ls
这两条敕令是先切换到根途径,再打印跟途径下的文件信息。
假如像上面一样,经由历程require('child_process').exec(`cd /`); require('child_process').exec(`ls`);
则只是实行了两个互相自力的敕令,一个是切换目次,一个是打印文件信息。ls打印的不是切换目次后的文件信息,而是运转剧本时地点的文件信息。
那怎样照顾上下文实行linux敕令呢?基础用法:
// 注重,这里应用到了colors模块,用于显现差别色彩的输出。不须要的话,也能够直接console.log()打印。 const subProcess = require('child_process').spawn("bash"); // 应用子顺序去运转某个软件,在这里就是运转bash软件。相当于运转一个终端 subProcess.stdout.on('data', function(data) { console.log(colors.green(data)); }); // 监听敕令实行后,bash返回的信息 subProcess.on('error', function() { console.log(colors.red('error\n' + arguments)); }); // 音讯的毛病监听 subProcess.on('close', (code) => { // 封闭bash历程后触发的事宜 if (code === 0) { console.log(colors.blue(`实行胜利!`)); } else { console.log(colors.blue(`实行失利,毛病码为:${code}`)); } }); // 监听历程退出 //向子历程发送敕令 subProcess.stdin.write(`cd / \n`); // 切换目次,\n示意回车,实行cd敕令 subProcess.stdin.write(`ls -a \n`); // 写入数据 subProcess.stdin.end(); // 完毕历程,相当于封闭终端
将某数据复制到剪切板
- 引见:这是一个很经常使用的功用
基础用法:
const copyProcess = require('child_process').spawn("bash"); // 用于复制暗码的历程 copyProcess.stdin.write(`echo ${Config.server.password} | pbcopy`); // 将特定文本拷贝到剪切板中 copyProcess.stdin.end(); // 完毕历程
经常使用剧本
上面引见了一些基础的node功用,虽然看似很简答。但假如擅长应用,也能够做出一些进步效力的小东西。
mhelp,一键检察自定义文档
- 功用引见:自定义经常使用文档,方便地检察。比方markdown语法,经常使用全局婚配的正则什么的。省的反复翻开笔记。
- 基础思绪:「colors色彩掌握」+「照顾参数运转剧本」
- 示例代码:
#!/usr/bin/env node
'use strict';
const colors = require('colors'); // 敕令行色彩black,red,green,yellow,blue,magenta,cyan,white,gray,grey
let helpName = process.argv[2]; // 须要检察的文档名
let helpInfo = {
markdown: {
'无需列表': '.1 xxx .1 xxx .1 xxx',
'有需列表': '- xxx - xxx - xxx',
}
}; // 自定义协助文档
// 设置文档name为他自身
let allHelpName = '';
let match = false; // 是不是找到婚配项
for (let helpItem in helpInfo) {
allHelpName += helpItem + `\n`;
if (helpItem === helpName) {
match = true;
for (let detailItem in helpInfo[helpItem]) {
console.log(colors.green(detailItem + ' : ' + helpInfo[helpItem][detailItem])); // 找不到页面相干信息
}
return;
}
}
if (!match) {
console.log(colors.red('can not find matched helpInfo! the all helpName is')); // 找不到页面相干信息
console.log(colors.red(allHelpName)); // 找不到页面相干信息
}
mop,一键翻开经常使用页面并复制暗码到剪切板
- 功用引见:简朴,一个敕令翻开特定页面,而且帮你把特定案牍复制到剪切板。比方?登陆暗码。
- 基础思绪:「复制剪切板」+「翻开页面」+「colors色彩掌握」
- 示例代码:
#!/usr/bin/env node
'use strict';
const proess = require('child_process');
const copyProcess = proess.spawn("bash"); // 用于复制暗码的历程,为了防止同一个历程拷贝和上传时的争执
const colors = require('colors'); // 敕令行色彩black,red,green,yellow,blue,magenta,cyan,white,gray,grey
const dataInfo = require('../config').dataInfo;
const introduce = require('../config').shellInfo['mop'].introduce; // 剧本引见,用在momoShell中引见
let dataName = process.argv[2]; // 须要翻开的页面
let onlyShow = process.argv[3]; // 是不是只显现数据,不翻开页面
let dataItem = dataInfo[dataName]; // 遍历胜利后猎取的页面对象
// 输入剧本简介
if (process.argv[2] === '-h') {
console.log(colors.green(introduce));
copyProcess.stdin.end();
return;
}
// 检测数据有效性
if (!dataName) { // 参数为空
console.log(colors.red('dataName can not be empty!'));
copyProcess.stdin.end();
return;
} else if (!dataItem) { // 找不到页面信息
let allDataName = '';
for (let dataItem in dataInfo) {
allDataName += `${dataItem}【${dataInfo[dataItem].info}】\n`;
}
console.log(colors.red('can not find matched dataInfo! the all dataName is')); // 找不到页面相干信息
console.log(colors.red(allDataName)); // 找不到页面相干信息
copyProcess.stdin.end();
return;
}
console.log(colors.green(`【name】${dataItem.name}`));
dataItem.account && console.log(colors.green(`【account】${dataItem.account}`));
dataItem.password && console.log(colors.green(`【password】${dataItem.password}`));
dataItem.url && console.log(colors.green(`【url】${dataItem.url}`));
// 将暗码拷贝到剪切板中
copyProcess.stdin.write(`echo ${dataItem.password} | pbcopy`); // 写入数据
copyProcess.stdin.end();
!onlyShow && dataItem.url && require('child_process').exec(`open ${dataItem.url}`); // 翻开特定页面
mgulp,一键gulp打包项目,一键动态革新
- 功用引见:处理了每一个项目都须要设置gulp及其依靠的贫苦。功用就如题目所说,一键gulp打包项目,一键动态革新(需连系livereload东西)
- 基础思绪:「照顾参数运转剧本」+「照顾上下文实行linux敕令」
- 示例代码:(这里还需连系gulpfile.js文件一同应用,详情请检察笔者github上的文件构造)
#!/usr/bin/env node
'use strict';
const Process = require('child_process').spawn("bash"); // 应用子顺序去运转某个软件。在这里就是运转bash软件。并猎取其上下文。
const colors = require('colors'); // 敕令行色彩black,red,green,yellow,blue,magenta,cyan,white,gray,grey
const Config = require('../config'); // 服务器信息
const introduce = Config.shellInfo['mgulp'].introduce; // 剧本引见,用在momoShell中引见
const elem = process.argv; // 输入的参数
const basePath = process.cwd();
const action = elem[2]; // 文件名
// 音讯监听,监听子历程的输出。并在主历程中打印出来。
function onData(data) { console.log(colors.green(data)); }
// 设置音讯监听
Process.stdout.on('data', onData);
Process.on('error', function() { console.log(colors.red('error\n' + arguments)); });
Process.on('close', (code) => {
if (code === 0) {
console.log(colors.blue(`实行胜利!`));
} else {
console.log(colors.blue(`实行胜利失利,毛病码为:${code}`));
}
}); // 监听历程退出
if (action === '-h') { // 输入剧本简介
console.log(colors.green(introduce));
return;
} else if (action === '-publish') { // 输入剧本简介
let inputPath = basePath + '/' + (elem[3] || ''); // 文件输入
let outputPath = basePath + '/' + elem[4]; // 文件输出
if (!elem[4]) {
outputPath = basePath + `/a-gulp-publish/${elem[3]}`;
}
Process.stdin.write(`cd /Users/Momo/Desktop/intruction/Node/shell \n`); // 切换pwd
Process.stdin.write(`gulp default --${inputPath} --${outputPath} \n`); // 实行gulp,经由历程「--」来让gulp不剖析为gulp使命
Process.stdin.end();
} else if (action === '-watch') { // 输入剧本简介
let watchList = elem[3];
if (!watchList) { // 检测数据有效性
console.log(colors.red('watchList can not be empty!'));
} else {
watchList = watchList.split(',').map((item) => { // 格式化途径
item = basePath + '/' + item;
item.replace(/\/\//g, '/'); // 去除双斜杠
if (item.indexOf('*') === -1) { // 监听一切文件,及旗下文件夹内的文件
item = item + '/*.*,' + item + '/*/*.*';
}
return item;
});
Process.stdin.write('cd /Users/Momo/Desktop/intruction/Node/shell \n'); // 切换pwd
Process.stdin.write('gulp reload --${watchList.join(',')} \n'); // 实行gulp
Process.stdin.end();
}
} else { // 输入剧本简介
console.log(colors.red('please input action'));
Process.stdin.end();
}
mupload,一键上传文件或文件夹到服务器
- 功用引见:如题,可上传全部文件夹,不须要翻开ftp软件这么贫苦(注重scp敕令不支撑强迫掩盖文件夹功用)
- 基础思绪:「复制剪切板」+「挪用linux敕令」+ 「scp敕令」
- 示例代码:
#!/usr/bin/env node
'use strict';
const colors = require('colors'); // 敕令行色彩black,red,green,yellow,blue,magenta,cyan,white,gray,grey
const Config = require('../config'); // 服务器信息
const copyProcess = require('child_process').spawn("bash"); // 用于复制暗码的历程,为了防止同一个历程拷贝和上传时的争执
const subProcess = require('child_process').spawn("bash"); // 应用子顺序去运转某个软件。在这里就是运转bash软件。并猎取其上下文。
const introduce = Config.shellInfo['mupload'].introduce; // 剧本引见,用在momoShell中引见
let elem = process.argv; // 输入的参数
let basePath = process.cwd();
let filePath = basePath + '/' + elem[2]; // 文件名
let targetPath = elem[3]; // 目的途径
// 将服务器暗码拷贝到剪切板中
copyProcess.stdin.write(`echo ${Config.server.password} | pbcopy`); // 写入数据
copyProcess.stdin.end();
// 输入剧本简介
if (process.argv[2] === '-h') {
console.log(colors.green(introduce));
copyProcess.stdin.end();
subProcess.stdin.end();
return;
}
// 检测数据有效性
if (!filePath || !targetPath) {
console.log(colors.red('filePath or targetPath can not be empty!'));
subProcess.stdin.end();
return;
}
// 兼容目的途径
if (targetPath[targetPath.length - 1] === '/') {
if (elem[2].indexOf('/') !== -1) {
targetPath += elem[2].substr(elem[2].indexOf('/') + 1);
} else {
targetPath += elem[2];
}
}
// 音讯监听,监听子历程的输出。并在主历程中打印出来。
function onData(data) { console.log(colors.green(data)); }
//设置音讯监听
subProcess.stdout.on('data', onData);
subProcess.on('error', function() { console.log(colors.red('error\n' + arguments)); });
subProcess.on('close', (code) => {
if (code === 0) {
console.log(colors.blue(`上传胜利!`));
console.log(colors.red(`注重,上传文件夹并不会掩盖原文件,请登录服务器检察文件是不是替代胜利`));
} else {
console.log(colors.blue(`上传失利,毛病码为:${code}`));
}
}); // 监听历程退出
//向子历程发送敕令
subProcess.stdin.write(`scp -C -r -p ${filePath} root@${Config.server.ip}:${targetPath} \n`); // 写入数据
subProcess.stdin.end();
另有其他的,像什么「一键git」「一键svn」,这些就依据实际须要组合开辟啦。
题目乞助
笔者在开辟剧本时,碰到两个题目,有兴致的大神能够指导指导
复制剪切板和scp的争执
这是「一键上传文件或文件夹到服务器」碰到的题目,复制剪切板和scp敕令会争执,假如放在同一个bash历程实行会失利,没找到缘由。
linux应对式异步交互,完成ssh的一键登录。
这个功用我用linux的shell剧本完成过。然则放在node没能找到完成思绪,