歡迎關注個人公衆號睿Talk
,獲取我最新的文章:
javascript
咱們開發用到的一些庫都有本身特有的命令,如webpack,babel和jest等。經過給這些命令輸入不一樣的參數,能夠獲得相應的功能。經過篇文章,你將學會如何一步步地編寫運行在弄的環境的自定義命令。java
新建一個文件夾cmd,而後建一個main.js文件,文件內容以下:node
#!/usr/bin/env node console.log('hello command');
注意必定要有這行代碼:#!/usr/bin/env node
,這行代碼叫shebang
或者hashbang
,它會告訴操做系統在運行這個文件文件的時候,須要用node的解析器來解析。webpack
這時候若是想直接運行這個命令,將會獲得一個報錯:
git
須要給這個文件添加一個執行的權限:github
chomd +x main.js
這樣就能正常的運行這一命令了:
web
下一步,咱們將藉助npm的特性,來給咱們的命令命名。npm
先在cmd目錄初始化npmjson
npm init
而後在生成的package.json文件中添加如下內容:segmentfault
"bin":{ "mycmd": "main.js" },
而後再運行
npm link
完成後就能夠直接輸入mycmd命令獲得結果了
此時你可能會感到疑惑,爲何經過npm link就能實現自定義命令呢?下面咱們再詳細瞭解npm link的運做機制。
輸入命令後,npm幫咱們作了如下這些工做
npm get prefix
看到這裏,你應該瞭解咱們正是藉助第二步,實現自定義命令的。但第一步的命令又有什麼做用呢?
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
說得有點遠了,再扯回到自定義命令上面來。若是咱們但願給命令傳入參數,該如何作呢?
咱們能夠藉助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
本文介紹瞭如何在 Node 開發環境下定製本身的命令,完成一些平常的自動化任務。若是這些任務比較通用,還能夠發佈到 npm,爲更多的人提高效率。