看以前熟讀已下文章:html
在全局的npm包環境中幫咱們創建一個軟鏈,路徑在{prefix}/lib/node_modules/。其中prefix能夠經過這條命令查詢到:node
npm get prefix
複製代碼
將配置文件中的bins連接到全局:{prefix}/bin/{name} 看到這裏,你應該瞭解咱們正是藉助第二步,實現自定義命令的。但第一步的命令又有什麼做用呢?git
第一步所作的工做將會爲咱們本地開發工具庫帶來很大的幫助。當咱們的工具庫還沒完成的時候,咱們並不想將其npm publish出去,而是但願先在本地調試一下。這時候,能夠進入調試的目標項目,好比cmd-test文件夾,運行如下命令:github
npm link cmd
複製代碼
其中cmd就是咱們的包名。運行完此命令後,npm會幫咱們在cmd-test文件夾中的node_modules目錄下創建一個cmd的軟鏈。固然,前提是cmd-test文件夾中已經有node_modules目錄,不然會一直向上找node_modules目錄直到根目錄位置。你也能夠手動建一個。數據庫
npm link cmd的效果跟npm install cmd 效果是徹底同樣的,咱們能夠使用link過來的全部功能,這對咱們本地調試工具庫很是有幫助。npm
若是要去除這個軟鏈,執行下面的命令就能夠了:json
npm unlink cmd
複製代碼
說得有點遠了,再扯回到自定義命令上面來。segmentfault
在運行bash
npm install . -g
複製代碼
會有一堆警告能夠忽視工具
若是你已經 npm link 搞了一遍你再 link 一遍,會報以下錯誤。即便你 npm unlink 也會報以下錯誤:
npm link
npm ERR! Darwin 14.3.0
npm ERR! argv "node" "/usr/local/bin/npm" "link"
npm ERR! node v0.10.36
npm ERR! npm v2.7.1
npm ERR! path /usr/local/bin/wcj
npm ERR! code EEXIST
npm ERR! Refusing to delete: /usr/local/bin/wcj not in /Applications/XAMPP/xamppfiles/htdocs/git/github.com/myJS/wcj
File exists: /usr/local/bin/wcj
Move it away, and try again.
讓你刪除 /usr/local/bin/wcj 再 npm link , 刪除此目錄運行 rm -rf /usr/local/bin/wcj
複製代碼
必須註冊 npm 帳號,還有 github 帳號,具體怎麼玩兒問 谷歌大嬸吧。在JSLite.io 中也有教程哦。
npm publish
複製代碼
sudo npm install -g sx
複製代碼
{
"name": "sx",
"version": "1.0.0",
"description": "SX CMD",
"bin": {
"sx": "bin/index.js"
},
"main": "index.js",
"author": "sx",
"license": "MIT",
"devDependencies": {
"commander": "^2.19.0",
"yargs": "^13.2.1"
}
}
複製代碼
#!/usr/bin/env node
var program = require('commander');
var argv = require('yargs').argv;
program
.allowUnknownOption() //取消這個自動報錯機制
.version('0.0.1')
.description('建立個人命令')
.option('-r, --resume', '簡歷')
.option('-d, --no-database [db]', '自定義數據') //後面能夠選擇是否跟參數值,no-*時默認值爲false
.option('-m, --mylove [db]', '個人最愛') //後面能夠選擇是否跟參數值,不加no-*時默認值爲true
.option('-l, --language <lang>', 'JS是我擅長的語言。') //<lang> required參數,使用時後邊必須跟參數值, 不然程序會報錯
.action(option => {
console.log('\n option回調:');
console.log(JSON.stringify(option));
})
.on('--help', function() {
console.log('---------------------------------------------------------------------------------------------')
console.log(' 自定義的例子: ')
console.log('')
console.log(' 輸出命令 sx -d')
console.log(' 輸出命令 sx -l node')
console.log('')
})
.parse(process.argv)
if(program.resume) {
console.log('簡歷' + program.resume + '這個是個人簡歷!');
}
if(program.language) console.log('我擅長的語言language: `' + program.language + '`');
if(program.database) console.log('我擅長的數據庫`' + program.database + '`');
if(program.mylove) console.log('個人最愛`' + program.mylove + '`');
console.log('\n program回調:');
console.log(program)
//console.log(JSON.stringify(program))
console.log('\n argv回調:');
console.log(JSON.stringify(argv))
複製代碼