跟着老司機玩轉Node自定義命令行

看以前熟讀已下文章:html

跟着老司機玩轉Node命令行

Nodejs 製做命令行工具

github.com/jaywcjlove/…

node生成自定義命令(yargs/commander)

經過nodejs實現自定義命令

inquirer.js —— 一個用戶與命令行交互的工具

Node.js 命令行程序開發教程

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

在全局的npm包環境中幫咱們創建一個軟鏈,路徑在{prefix}/lib/node_modules/。其中prefix能夠經過這條命令查詢到:node

npm get prefix
複製代碼

將配置文件中的bins連接到全局:{prefix}/bin/{name} 看到這裏,你應該瞭解咱們正是藉助第二步,實現自定義命令的。但第一步的命令又有什麼做用呢?git

npm link

第一步所作的工做將會爲咱們本地開發工具庫帶來很大的幫助。當咱們的工具庫還沒完成的時候,咱們並不想將其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中

  • 發佈

必須註冊 npm 帳號,還有 github 帳號,具體怎麼玩兒問 谷歌大嬸吧。在JSLite.io 中也有教程哦。

npm publish
複製代碼
  • 安裝 前提你發佈到了npm中,你就能夠運行下面的命令了。
sudo npm install -g sx
複製代碼

DEMO

  • package.json
{
 "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"
 }
}

複製代碼
  • bin/index.js
#!/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))
複製代碼

相關文章
相關標籤/搜索