經過nodejs實現自定義命令

歡迎關注個人公衆號睿Talk,獲取我最新的文章:
clipboard.pngjavascript

1、前言

咱們開發用到的一些庫都有本身特有的命令,如webpack,babel和jest等。經過給這些命令輸入不一樣的參數,能夠獲得相應的功能。經過篇文章,你將學會如何一步步地編寫運行在弄的環境的自定義命令。java

2、編寫命令文件

新建一個文件夾cmd,而後建一個main.js文件,文件內容以下:node

#!/usr/bin/env node

console.log('hello command');

注意必定要有這行代碼:#!/usr/bin/env node,這行代碼叫shebang或者hashbang,它會告訴操做系統在運行這個文件文件的時候,須要用node的解析器來解析。webpack

這時候若是想直接運行這個命令,將會獲得一個報錯:
clipboard.pnggit

須要給這個文件添加一個執行的權限:github

chomd +x main.js

這樣就能正常的運行這一命令了:
clipboard.pngweb

下一步,咱們將藉助npm的特性,來給咱們的命令命名。npm

3、使用npm定製命令

先在cmd目錄初始化npmjson

npm init

而後在生成的package.json文件中添加如下內容:segmentfault

"bin":{
    "mycmd": "main.js"
  },

而後再運行

npm link

完成後就能夠直接輸入mycmd命令獲得結果了

clipboard.png

此時你可能會感到疑惑,爲何經過npm link就能實現自定義命令呢?下面咱們再詳細瞭解npm link的運做機制。

4、npm link

輸入命令後,npm幫咱們作了如下這些工做

  • 在全局的npm包環境中幫咱們創建一個軟鏈,路徑在{prefix}/lib/node_modules/<package>。其中prefix能夠經過這條命令查詢到:
npm get prefix
  • 將配置文件中的bins連接到全局:{prefix}/bin/{name}

看到這裏,你應該瞭解咱們正是藉助第二步,實現自定義命令的。但第一步的命令又有什麼做用呢?

npm link第一步所作的工做將會爲咱們本地開發工具庫帶來很大的幫助。當咱們的工具庫還沒完成的時候,咱們並不想將其npm publish出去,而是但願先在本地調試一下。這時候,能夠進入調試的目標項目,好比cmd-test文件夾,運行如下命令:

npm link cmd

其中cmd就是咱們的包名。運行完此命令後,npm會幫咱們在cmd-test文件夾中的node_modules目錄下創建一個cmd的軟鏈。固然,前提是cmd-test文件夾中已經有node_modules目錄,不然會一直向上找node_modules目錄直到根目錄位置。你也能夠手動建一個。

npm link cmd的效果跟npm install cmd效果是徹底同樣的,咱們可使用link過來的全部功能,這對咱們本地調試工具庫很是有幫助。

若是要去除這個軟鏈,執行下面的命令就能夠了:

npm unlink cmd

說得有點遠了,再扯回到自定義命令上面來。若是咱們但願給命令傳入參數,該如何作呢?

5、commander

咱們能夠藉助commander這個工具,幫咱們獲取到從process.argv裏面傳進來的參數,使用方法也很簡單:

#!/usr/bin/env node

/**
 * Module dependencies.
 */

var program = require('commander');

program
  .version('0.1.0')
  .option('-p, --peppers', 'Add peppers')
  .option('-P, --pineapple', 'Add pineapple')
  .option('-b, --bbq-sauce', 'Add bbq sauce')
  .option('-c, --cheese [type]', 'Add the specified type of cheese [marble]', 'marble')
  .parse(process.argv);

console.log('you ordered a pizza with:');
if (program.peppers) console.log('  - peppers');
if (program.pineapple) console.log('  - pineapple');
if (program.bbqSauce) console.log('  - bbq');
console.log('  - %s cheese', program.cheese);

經過option這個函數來定義支持的參數,而後在使用的時候直接經過獲取program的屬性拿到傳進來的參數。具體用法請看官方文檔:commander

6、總結

本文介紹瞭如何在 Node 開發環境下定製本身的命令,完成一些平常的自動化任務。若是這些任務比較通用,還能夠發佈到 npm,爲更多的人提高效率。

相關文章
相關標籤/搜索