Nodejs學習記錄: 製做命令行工具

咱們常常會遇到這樣的需求:想要將Node模塊轉變成一個Linux命令行工具,包括支持命令行選項/參數。html

小實例

開始編寫以前須要確認的一件事情是你已經安裝了Node.js。你能夠在命令行中運行 which node 來確認是否已經安裝,或者運行 node -v 查看 node 的版本 。若是你已經安裝了node,你能夠看到相似於下面的輸出結果,通常狀況安裝了node.js 順帶npm工具自動安裝了。前端

$ which node
/d/Program Files/nodejs/node
$ node -v
v7.9.0

建立目錄

代碼 :https://github.com/JXtreehous...node

首先任意建立一個文件夾,初始化 package.json 文件,在該文件夾下建立bin目錄:linux

$ mkdir command-line-tool #建立一個文件夾
$ cd command-line-tool && mkdir bin
$ npm init #初始化 `package.json` 文件

編寫命令行

cd到 bin 目錄下,新建一個 commander.js 文件(名字自取),編寫以下代碼,在js文件頂部加上 #!/usr/bin/env node 這段代碼:git

上面的 #!/usr/bin/env node (或者/d/Program Files/nodejs/node
),表示用後面的路徑所示的程序來執行當前文件夾。還須要一個 package.json 文件github

{
  "name": "command-line-tool",
  "version": "0.1.0",
  "description": "a commander example",
  "main": "commander.js",
  "bin": {"commander": "bin/commander.js"},
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "AlexZ33",
  "license": "MIT"
}

運行 node bin/wcommander.js 會顯示當前文件夾下的因此文件和文件夾名web

package.json 文件中 bin 裏面的內容表示這個字段將commander 命令映射到了你的 bin/commander.js 腳本npm

npm-link
package.json#bin
版本號管理:此工具採用 npm版本號採用的 semver 規則json

npm link

確保你在 package.json 文件中添加了 bin 節點。而後打開命令了工具進入command-line-tool目錄segmentfault

"bin": {"commander": "bin/commander.js"}

啓用命令行:

打開命令行,輸入npm link會自動添加全局的symbolic link,而後就可使用本身的命令了。

npm link

這裏咱們經過npm link在本地安裝了這個包用於測試,而後就能夠經過

$ commander
//bin
//package.json

$ commander -v
//version is 1.0.0

$ commander -h 
//Useage:
//  -v --version [show version]

更多npm link的信息請查看 npm官方文檔

用Phantom和Commandder製做一個截屏工具

如上面的小例子,第一行咱們依然

#!/usr/bin/env node

而後要提供命令行參數/選項,包括重要的--help,須要使用Commander模塊:

const phantom = require('phantom')
const program = require('commander');

program
  .version('0.0.1')
  .option('-s, --source[website]', 'Source website')
  .option('-f, --file[filename]', 'filename')
  .parse(process.argv)

const run = async() => {
  
  const instance = await phantom.create();
  const page = await instance.createPage();
  await page.on('onResourceRequested', function(requestData) {
    console.info('Requesting', requestData.url)
  });
  const status = await page.open(program.source)
  
  await instance.exit();
}
run()

上面這段

const run = async() => {
  
}
run()

能夠直接寫成自執行匿名函數

(async function(){
  
})();

圖片描述
npm phantom

處理命令行參數的經常使用模塊

yargs 和 minimist 都是用來解析命令行參數的,可是有一點須要注意的是 yargs 內部的解析引擎就是 minimist。minimist 就是一個輕量級的命令行參數解析引擎。

  • inquirer: 一個用戶與命令行交互的工具

它們二者共同點確定有,不一樣點就是 yargs 是對 minimist 進行了更進一步的封裝。

有意思的包

node-getmac

/**
 * @file get local mac address
 * @author liulangyu(liulangyu90316@gmail.com)
 */

var execSync = require('child_process').execSync;
var platform = process.platform;

module.exports = (function () {
    var cmd = {
        win32: 'getmac',
        darwin: 'ifconfig -a',
        linux: 'ifconfig -a || ip link'
    }[platform];

    var regStr = '((?:[a-z0-9]{2}[:-]){5}[a-z0-9]{2})';

    var macReg = new RegExp('ether\\s' + regStr + '\\s', 'i');

    try {
        var data = execSync(cmd).toString();
        var res = {
            win32: new RegExp(regStr, 'i').exec(data),
            darwin: macReg.exec(data),
            linux: macReg.exec(data)
        }[platform];


        if (res) {
            return res[1];
        }
    }
    catch (e) {
        return '';
    }
})();

參考

使用Node.js建立命令行工具
Building a simple command line tool with npm
Nodejs 製做命令行工具
Node.js 命令行程序開發教程 by 阮一峯
前端掃盲-之打造一個Node命令行工具

相關文章
相關標籤/搜索