《Nodejs開發加密貨幣》之六:Commander介紹

關於

《Nodejs開發加密貨幣》,是一個加密貨幣產品的詳細開發文檔,涉及到使用Nodejs開發產品的方方面面,從前端到後臺、從服務器到客戶端、從PC到移動、加密解密、區款鏈等各個環節。代碼完全開源、文章免費分享。 相關資源見 http://ebookchain.org

QQ交流羣: 185046161

前言

在源碼分享之前,我們先簡單分享一下commander和async兩個組件(或模塊)的應用,這裏,按照我個人的理解來描述。

題外話

搞編程的都是學習高手。但不同的人,方法迥異。有的天生聰穎,翻翻源碼和文檔,就能在日後自由使用。相反,有的就差一些,我個人就算典型的一個,堅信自己愚鈍至極。

我經常遇到這樣的情況,對於某個組件,這次用了,下次有需要,還要再看文檔,特別是在方法的選擇上,有時候要反覆試驗。所以,多年來,我認真總結和改進自己的做法,努力向高手靠攏。

這關係到“知識”的理解和吸收。知識由語言組成,語言由概念和邏輯組成,概念和邏輯涉及到人的記憶能力與分析能力。很多人喜歡邏輯上的思考,而對於概念“視而不見”。

事實上,概念中含有邏輯,是邏輯的高級濃縮版。概念清晰,邏輯必然是清晰的,相反卻未必。因此,學習知識,掌握概念最重要。

比如,什麼是模塊,什麼叫組件?我的理解是,Nodejs提供的原生功能模塊,叫模塊module,例如:domain),而第三方提供的獨立功能模塊稱爲組件(component),其實他們都叫中間件middleware),本質沒什麼區別。

但是,在自己的思維邏輯中,這麼簡單的區分一下,其實表明我們掌握了更多信息,比如在文檔、代碼質量、可信度等方面,模塊天生要好於組件。知道domain是模塊,自然會去nodejs官網查找最可靠的資料(注,官方計劃廢棄domain,不提倡再使用了)。

因此,我的做法就是解讀概念(官方提供)、提煉概念(官方沒有)、解釋概念(介紹用法),用自己的理解梳理相關知識。這裏的概念不以“全”爲目標,以“好記、好用、好區分”爲主。

以後介紹的每個組件或模塊,網上都會有很多相關文檔。我的做法自然也規避了文字雷同的可能,畢竟人的思維可以相似,但不會相同。

本文,先介紹commander,看能否讓您一下記住,並直接用於開發。

Commander

事實上,在Nodejs或ruby等語言環境裏,只要在文件頭部添加一行所謂的shebang(提供一個執行環境),就可以將代碼轉爲命令行執行。難在命令行選項處理和流程控制,所以纔有了這類工具的出現,叫它們命令行框架最合適。

類似Commander的工具有很多,但多數以規範命令行選項爲主,對一些編碼細節還要自己實現,比如:何時退出程序(調用process.exit(1))。Commander把這一切都簡化了,小巧靈活、簡單易用,有它足夠了。

1.概念定義

簡單直接的命令行工具開發組件。

2.概念解釋

  • 這是一個組件,說明是第三方開發的,其實就是開發Express的大神tj開發的。ruby語言也有一個同名的開發組件,同樣是tj的傑作,所以,雖爲組件,但足夠權威,“您值得擁有”。
  • 命令行工具開發Commander的英文解釋是命令,如其名字,這個是用來開發命令行命令的。
  • 簡單直接,怎麼簡單?四個函數而已。怎麼直接?如果您瞭解“命令行”的話,就能體會深刻,它通常包含命令、選項、幫助和業務邏輯四個部分,該組件分別提供了對應函數。

因此,只要記住該Commander這個名字和這一句話的概念定義,基本上已經掌握了該組件的全部。下面的用法介紹,僅僅是幫助您更好的記憶和使用。

3.用法介紹:

這裏,我們也給它概念化,叫“命令行開發三步曲”。具體以 gitbook-summary爲例,解釋如下:

  • 第1步:給工具起名字

這個名字,是工具的名字(其實也是命令,我叫它主命令),用來區分系統命令,限定命令使用的上下文。我通常用工程的名字或操作對象的名字代替,是個名詞,比如:book。而用Commander寫的命令是個動詞(其實是用.command()方法定義的子命令),比如:generate,最後的形式如下:

$ book generate [--options]

只所以把起名字單獨提出來,主要是在Nodejs的世界裏,這一步是固定不變的,只要記住就是了。方法是,在package.json裏定義下面的字段:

{
  "bin": {
    "book": "./path/to/your-commander.js"
  }
}

package.json文件是包配置文件,是全局配置不可逾越之地。很多工具,都是基於它,提供入口程序的。比如:Nodejs自己就是請求main字段的(沒有定義,默認請求index.js文件),Npm請求scripts字段。這裏多了一個,Commander請求bin字段。

如果,不使用package.json,那麼定義的就是node命令之下的子命令,調用方法是:

$ node ./path/to/your-commander.js generate [--options]

如果連node都不想輸入,那麼就要在代碼第一行添加shebang,即:

#!/usr/bin/env node
  • 第2步:填充四個函數

這一步,用於定義命令、選項、幫助和業務邏輯,完全是Commander概念定義的使用。其實,第三方組件,也就是起到這種微框架的作用。具體用法,自然最好是看 官方文檔 了。這裏,需要進一步思考的是,對於這個組件而言,這四個函數,最重要的是什麼?

我們想到的通常是業務邏輯,不過,請注意,只要是開發,邏輯部分自然只能開發者自己實現,所以,Commander僅僅提供了一個接口函數而已。這裏的命令,僅是一個名稱。幫助是提示,也僅是簡單的文本信息。剩下的各種選項,可以規範,也最爲關鍵,纔是Commander的可愛之處。

(1)命令: 使用command函數定義(子命令),例如

var program = require("commander");

program
    .command("summary <cmd>")
    .alias("sm") //提供一個別名
    .description("generate a `SUMMARY.md` from a folder") //描述,會顯示在幫助信息裏
...

當使用-h選項調用命令時,上述命令summary|sm會被顯示在幫助信息裏。這裏的aliasdescription僅是錦上添花而已。

更復雜的,例如下面官方的例子, .command() 包含了描述信息和 .action(callback) 方法調用,就是說要用子命令各自對應的執行文件,這裏就是./pm-install.js,以及 ./pm-search.js 和 ./pm-list.js等。

#!/usr/bin/env node

var program = require('..');

program
  .version('0.0.1')
  .command('install [name]', 'install one or more packages')
  .command('search [query]', 'search with optional query')
  .command('list', 'list packages installed')
  .command('publish', 'publish the package')
  .parse(process.argv);

說明:不使用command方法直接定義主命令,個人建議不要這麼做。中規中矩地定義每一個子命令(本文統稱命令),只要使用command方法,不帶描述信息,附帶action方法。如果定義類似git類型的,一連串的命令,一個一個來,顯然麻煩,就把描述信息放在command裏,去掉action方法,這時默認請求對應的js文件。

(2)選項:使用option方法定義,可以理解爲命令行數據結構

該函數很簡單,可以方便的將文本輸入轉化爲程序需要的數據形式。其功能如下:

  • 可以設置任何數量的選項,每一個對應一個.option函數調用;
  • 可以設置默認值;
  • 可以提供文本、數值、數組、集合和範圍等約束類型(通過提供處理函數);
  • 可以使用正則表達式;

說明option方法,基本使用就用選項名稱和描述;複雜一點就要提供處理函數或默認值;再複雜就用arguments方法代替option方法,使用可變參數(帶...的參數)。

(3)幫助: 使用help方法輸出一切有用的描述信息,這些信息通常在命令和選項的定義中,例如

program.help();

如果要定製幫助信息,就用:

program.on('--help',cb);

(4)邏輯: 使用action方法註冊邏輯,將代碼轉向執行自己的邏輯代碼,當然,git類型的多命令也可以不用。例如

program.action(function(cmd, options) { //code });
  • 第3步:開發業務邏輯

撰寫action可以調用的代碼就是了。

4.案例分析:

代碼地址:https://github.com/imfly/gitbook-summary 具體內容,請自己看代碼吧。

這是一個一鍵生成文檔目錄文件的命令行工具,以後可能還會加入簡繁轉化功能。生成的目錄文件,是gitbook生成電子書的必須文件。

我從來不願意爲寫作而寫作,更不願意處理任何重複性的工作,因此,隔一段時間,經常積累一堆問題清單和零零散散的文檔。這個命令行工具基本上爲自己定製。但發現也有很多小盆友在用,看來跟我一樣,^_^。

總結

這篇僅僅介紹了commander組件的相關概念和使用,關於如何安裝(簡單一條命令)、如何修改權限,都沒有細說。這類知識,我堅信網上一搜多的是,自行補充吧。

鏈接

本系列文章即時更新,若要掌握最新內容,請關注下面的鏈接

本源文地址: https://github.com/imfly/bitcoin-on-nodejs

電子書閱讀: http://bitcoin-on-nodejs.ebookchain.org

電子書下載: 下載頁面

參考

Node.js 命令行程序開發教程(中文): http://www.ruanyifeng.com/blog/2015/05/command-line-with-node.html

用npm構建簡單命令行(英文): http://blog.npmjs.org/post/118810260230/building-a-simple-command-line-tool-with-npm

用Node.js開發命令行工具(英文): http://shapeshed.com/command-line-utilities-with-nodejs/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章