手把手教你寫命令列工具
命令列工具,即 Cli(command-line interface)。是在圖形使用者介面得到普及之前使用最為廣泛的使用者介面,它通常不支援滑鼠,使用者通過鍵盤輸入指令,計算機接收到指令後,予以執行。在學習這篇教程之前,你需要先了解NodeJs,NPM和一些常用的shell命令!
對於前端開發者來說,用NodeJs開發命令列工具是最方便和快速的,藉助於 npm,可以方便的進行除錯和釋出。
NodeJs的命令列使用如下圖所示:
![](https://img2018.cnblogs.com/blog/1546356/201812/1546356-20181226155944428-1188789697.png)那麼怎麼從零開始寫一個命令列工具呢?
一、建立一個新專案
首先,我們建立一個npm專案。
```$ mkdir cli-demo $ cd cli-demo $ npm init ```通過以上步驟,我們新建了一個cli-demo
資料夾,並且在cli-demo
資料夾中初始化了一個package.json
檔案。package.json
的內容大概是這樣:
{ "name": "cli-demo", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "author": "", "license": "MIT" }
二、新建一個可執行檔案
我們在cli-demo
資料夾中,新建一個js檔案,這裡我們新建一個名為cli.js
的檔案。
我們在寫命令列工具的時候,需要指定一個可執行檔案。在package.json
中,bin
欄位用來對映命令名和可執行檔案。在通過npm install -g
全域性安裝的時候,npm會symlink
可執行檔案到prefix/bin
資料夾。
如果通過npm install
本地安裝的時候, npm會symlink
可執行檔案到./node_modules/.bin/
資料夾。(完整的欄位說明在這裡:https://docs.npmjs.com/files/...
如何讓一個js檔案變成可執行檔案?只需要在js檔案的頭部加上一行程式碼:
#!/usr/bin/env node
稍微完善一下cli.js
, 如下:
#!/usr/bin/env node
console.log('Hello world!');
三、指定cli.js
為執行檔案
我們需要在package.json
中,指定bin
欄位將cli.js
作為我們的執行檔案。
{
"bin": "cli.js"
}
或者:
{
"bin": {
"cli-demo": "cli.js"
}
}
四、除錯
我們全域性安裝一個cli包後,可以全域性呼叫這個命令列工具。那我們在開發除錯的時候, 就要用到npm link
這個命令了。
在npm包資料夾下執行npm link
命令,會建立一個符號連結,連結全域性資料夾{prefix}/lib/node_modules/<package>
和你執行npm link
的包資料夾。注意:
package-name
是package.json
中的name
, 而不是資料夾名。詳細的解釋在這兒: https://docs.npmjs.com/cli/link
我們在cli-demo
資料夾下執行npm link
命令後,就可以全域性使用cli-demo
命令了。
Hello world!
<h3>五、使用命令列輔助工具</h3>
<p>在我們寫命令列工具的時候,使用一些輔助工具會讓我們開發更高效。以下是一些我用過的一些輔助工具:</p>
<ul>
<li>
<a href="https://github.com/tj/commander.js" rel="nofollow noreferrer">Commander.js</a> - 幫助引數解析,我最常用</li>
<li>
<a href="https://github.com/gkz/optionator" rel="nofollow noreferrer">optionator</a> - 幫助引數解析,<a href="https://github.com/eslint/eslint" rel="nofollow noreferrer">Eslint</a> 使用</li>
<li>
<a href="https://github.com/SBoudrias/Inquirer.js" rel="nofollow noreferrer">Inquirer.js</a> - 常見互動式命令列</li>
<li>
<a href="https://github.com/chalk/chalk" rel="nofollow noreferrer">chalk</a> - 命令列輸出自定義顏色</li>
</ul>
<p>修改我們的<code>cli.js</code>,使用<a href="https://github.com/tj/commander.js" rel="nofollow noreferrer">Commander.js</a>做一些更復雜的操作。</p>
<p>首先,安裝<code>commander.js</code>:</p>
```npm i commander
cli.js
程式碼:
#!/usr/bin/env node
const program = require('commander');
program
.version('0.1.0')
.option('-n, --yourname [yourname]', 'Your name')
.option('-g, --glad', 'Tell us you are happy')
.parse(process.argv);
if (program.yourname) {
console.log(`Hello, ${program.yourname}! ${program.glad ? 'I am very happy to see you!' : ''}`);
}
在命令列中使用:
```$ cli-demo -hUsage: cli-demo [options]
Options:
-V, --version output the version number
-n, --yourname [yourname] Your name
-g, --glad Tell us you are happy
-h, --help output usage information
```$ cli-demo -n Jay
Hello, Jay!
Hello, Jay! I am very happy to see you!
六、釋出
單純的釋出包到npm非常簡單,只需要一條命令:
```npm publish ```但是一個完善規範的釋出流程不僅如此,還需要考慮版本號的規範(Semver),commit message的規範,tag等一系列因素。如果手動來搞的話,是挺麻煩的。
這裡推薦使用relix, 一步搞定!
```npm i relix -g ```進入cli-demo
資料夾,然後:
會自動幫你生成新版本號,生成提交資訊,打tag,推送提交和tag到github,釋出npm包!relix的詳細用法請看relix文件。
本章完。
進階閱讀: 怎麼樣寫一個能告訴你npm包名字是否被佔用的工具我的Github:https://github.com/PengJiyuan
來源: