怎样设置node全局剧本

前语

跟着node的盛行,JS已能够处理大部份题目。这对前端工程师非常友爱。
置信许多同砚在开辟营业之余,都邑写一些小剧本替代手工完成烦琐,反复的事情,从而进步事情效力。
但部份同砚开辟的剧本,仅范围于剧本地点途径,经由历程node xxx 去运转顺序,这范围了剧本的应用范围和应用便利性。

本文就给人人引见一个简朴且一劳永逸的要领,把自身开辟的node剧本布置在全局环境。让剧本能够像Linux敕令一样,全局便利地应用,今后翻开新世界的大门。

《怎样设置node全局剧本》

全局剧本设置的实质思绪

实在道理很简朴:将Linux的全局敕令搜刮途径,加上剧本地点文件夹的途径。

《怎样设置node全局剧本》

详细设置历程

找到终端设置文件

  • 终端设置文件默许途径为「/User/用户名」,笔者的mac用户名为Momo,故以下示例顶用户名均为「Momo」。
  • 原配终端为bash,对应设置文件为「.bash.rc」。装了zsh终端的同砚,对应修正「.zsh.rc」。
  • 剖析:.rc文件为终端的设置文件,在重启终端,或许新开终端tab都邑读取该文件。

《怎样设置node全局剧本》

修正Linux的全局敕令搜刮途径

  • 翻开文件,加上剧本地点文件夹。笔者的剧本均放在了myShell(实在应当叫myScript)文件夹中,所以加上一句export PATH=/Users/Momo/myShell:$PATH
  • 剖析:在Linux中,全局敕令搜刮途径就是经由历程PATH变量保存起来的。「:」是字符串链接符的意义。类似于js中,var str = ‘1’ + ‘2’;中的「+」
    《怎样设置node全局剧本》

修正js剧本文件

  • 在头部加上#!/usr/bin/env node'use strict';
  • 剖析:#!/usr/bin/env node是指本剧本是经由历程「/usr/bin/env」途径下的node软件运转。相当于文件中什么软件翻开。'use strict';是指应用js的严厉语法。
  • 注重这两句一定要安排为js文件顶部,不然体系将不晓得用什么软件实行。运转失利
    《怎样设置node全局剧本》

修正js剧本文件权限

  • 终端运转chmod 777 剧本文件名,如示例chmod 777 mop
  • 剖析:chmod是linux下修正文件权限的东西,777代表一切读写权限。详细的百度chmod即可。权限设置了今后,剧本的图标将变成下面这个模样。

    《怎样设置node全局剧本》

重启或新建终端,实行剧本。

  • 剖析:重启或新建终端是为了读取到刚修正的终端设置文件,让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全局剧本》

经常使用剧本

上面引见了一些基础的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」,这些就依据实际须要组合开辟啦。

题目乞助

笔者在开辟剧本时,碰到两个题目,有兴致的大神能够指导指导

《怎样设置node全局剧本》

复制剪切板和scp的争执

这是「一键上传文件或文件夹到服务器」碰到的题目,复制剪切板和scp敕令会争执,假如放在同一个bash历程实行会失利,没找到缘由。

linux应对式异步交互,完成ssh的一键登录。

这个功用我用linux的shell剧本完成过。然则放在node没能找到完成思绪,

    原文作者:momo707577045
    原文地址: https://segmentfault.com/a/1190000012915226
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞