日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線(xiàn)溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
從零開(kāi)始打造個(gè)人專(zhuān)屬命令行工具集——yargs完全指南

【引自ideras.me的博客】前言

公司主營(yíng)業(yè)務(wù):成都網(wǎng)站建設(shè)、網(wǎng)站制作、移動(dòng)網(wǎng)站開(kāi)發(fā)等業(yè)務(wù)。幫助企業(yè)客戶(hù)真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。創(chuàng)新互聯(lián)建站是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開(kāi)放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來(lái)的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶(hù)帶來(lái)驚喜。創(chuàng)新互聯(lián)建站推出邛崍免費(fèi)做網(wǎng)站回饋大家。

使用命令行程序?qū)Τ绦騿T來(lái)說(shuō)很常見(jiàn),就算是前端工程師或者開(kāi)發(fā)gui的,也需要使用命令行來(lái)編譯程序或者打包程序

熟練使用命令行工具能極大的提高開(kāi)發(fā)效率,linux自帶的命令行工具都非常的有用,但是這些工具都是按照通用需求開(kāi)發(fā)出來(lái)的 ,如果有一些特別的需求,還是需要自己寫(xiě)腳本來(lái)完成一些比如文件批量重命名,文件內(nèi)容批量替換等任務(wù)來(lái)提供工作效率。

在node.js出來(lái)之前,python經(jīng)常被用來(lái)開(kāi)發(fā)一些腳本完成特殊的任務(wù),比如python爬蟲(chóng),python相關(guān)的教程有很多,有興趣的自己google。

得益于node.js的異步io特性,使用node開(kāi)發(fā)io密集類(lèi)任務(wù)變得非常簡(jiǎn)單,這篇文章就為大家講講怎么使用node.js的yargs模塊來(lái)開(kāi)發(fā)自己的命令行工具集合。

命令行參數(shù)解析

yargs是一個(gè)npm模塊用來(lái)完成命令行參數(shù)解析的,回到使用shell開(kāi)發(fā)命令行的時(shí)代,getopts是***代命令行參數(shù)解析工具,經(jīng)過(guò)shell => python => node.js 的迭代,命令行參數(shù)解析程序其實(shí)沒(méi)有多大的進(jìn)化,它們的目的始終是把用戶(hù)從命令行傳入的參數(shù)解析成指定的格式,供程序使用

雖然沒(méi)有多大變化,但是由于開(kāi)發(fā)一個(gè)命令行參數(shù)解析模塊比較簡(jiǎn)單,所以目前node社區(qū)存在很多類(lèi)似yargs的開(kāi)源項(xiàng)目,這里簡(jiǎn)單列舉一下,有興趣的可以自己去了解一下, 然后選擇自己喜歡的項(xiàng)目來(lái)使用。

  • minimist 源自
  • optimist 模仿python的optimist項(xiàng)目
  • commander.js tj是node.js大神,co的作者, commander.js源自ruby的commander項(xiàng)目,作者也是tj
  • nopt npm項(xiàng)目中使用
  • nomnom 不再維護(hù),不建議使用

yargs

讀過(guò)阮一峰的Node.js 命令行程序開(kāi)發(fā)教程之后開(kāi)始使用yargs開(kāi)發(fā)自己命令行工具, 用過(guò)一段時(shí)間發(fā)現(xiàn)非常的好用。

自阮大神的文章發(fā)布以來(lái),yargs有了一些改動(dòng),添加有很多有用的功能,特別是.commandDir(directory, [opts])這個(gè)功能,對(duì)打造命令行工具集合非常有用,所以寫(xiě)一個(gè)新版本的yargs教程還是有必要的。

yargs的用法還算比較簡(jiǎn)單,對(duì)英文有自信的可以去首頁(yè)閱讀原版:yargs

簡(jiǎn)單模式

yargs默認(rèn)使用兩個(gè)--作為參數(shù)的前綴,中間使用空格或者=都可以

下面的代碼展示了yargs最簡(jiǎn)單的用法,你只需要引入yargs,就能讀取命令行參數(shù),不需要寫(xiě)任何的配置,非常的簡(jiǎn)單

 
 
  1. #!/usr/bin/env node 
  2. var argv = require('yargs').argv; 
  3.  
  4. if (argv.ships > 3 && argv.distance < 53.5) { 
  5.     console.log('Plunder more riffiwobbles!'); 
  6. } else { 
  7.     console.log('Retreat from the xupptumblers!'); 
  8. }  
 
 
  1. $ ./plunder.js --ships=4 --distance=22 
  2. Plunder more riffiwobbles! 
  3.  
  4. $ ./plunder.js --ships 12 --distance 98.7 
  5. Retreat from the xupptumblers! 

 示例代碼都來(lái)自官網(wǎng):yargs

簡(jiǎn)單模式還能讀取短變量如-x 4相當(dāng)于argv.x = 4

簡(jiǎn)單模式還能讀取布爾類(lèi)型-s相當(dāng)于argv.s = true

簡(jiǎn)單模式還能讀取非-開(kāi)始的變量,這種類(lèi)型的變量保存在argv._數(shù)組里面

參數(shù)配置

簡(jiǎn)單模式的功能都只用一行代碼就能實(shí)現(xiàn)

 
 
  1. var argv = require('yargs').argv; 

但是如果你想統(tǒng)計(jì)變量出現(xiàn)的次數(shù)怎么辦? 答案就是添加參數(shù)配置選項(xiàng)。

 
 
  1. #!/usr/bin/env node 
  2. var argv = require('yargs') 
  3.     .count('verbose') 
  4.     .alias('v', 'verbose') 
  5.     .argv; 
  6.  
  7. VERBOSE_LEVEL = argv.verbose; 
  8.  
  9. function WARN()  { VERBOSE_LEVEL >= 0 && console.log.apply(console, arguments); } 
  10. function INFO()  { VERBOSE_LEVEL >= 1 && console.log.apply(console, arguments); } 
  11. function DEBUG() { VERBOSE_LEVEL >= 2 && console.log.apply(console, arguments); } 
  12.  
  13. WARN("Showing only important stuff"); 
  14. INFO("Showing semi-important stuff too"); 
  15. DEBUG("Extra chatty mode"); 

 上面的程序能統(tǒng)計(jì)verbose參數(shù)出現(xiàn)的次數(shù),縮寫(xiě)-v也會(huì)統(tǒng)計(jì)進(jìn)去,具體調(diào)用例子參考下面的代碼

 
 
  1. $ node count.js 
  2. Showing only important stuff 
  3.  
  4. $ node count.js -v 
  5. Showing only important stuff 
  6. Showing semi-important stuff too 
  7.  
  8. $ node count.js -vv 
  9. Showing only important stuff 
  10. Showing semi-important stuff too 
  11. Extra chatty mode 
  12.  
  13. $ node count.js -v --verbose 
  14. Showing only important stuff 
  15. Showing semi-important stuff too 
  16. Extra chatty mode 

 yargs提供很多接口用來(lái)幫助完善命令行程序,

提示用法

 
 
  1. var argv = require('yargs') 
  2.     .usage('Usage: $0 -w [num] -h [num]') 
  3.     .argv; 

 必選參數(shù)

 
 
  1. #!/usr/bin/env node 
  2. var argv = require('yargs') 
  3.     .usage('Usage: $0 -w [num] -h [num]') 
  4.     .demand(['w','h']) 
  5.     .argv; 

 提供參數(shù)默認(rèn)值

 
 
  1. #!/usr/bin/env node 
  2. var argv = require('yargs') 
  3.     .default('x', 10) 
  4.     .default('y', 10) 
  5.     .argv 
  6. console.log(argv.x + argv.y); 

 打印幫助信息

 
 
  1. #!/usr/bin/env node 
  2. var argv = require('yargs') 
  3.     .usage('Usage: $0  [options]') 
  4.     .help('h') 
  5.     .alias('h', 'help') 
  6.     .epilog('copyright 2015') 
  7.     .argv; 

 使用別名

 
 
  1. var argv = require('yargs') 
  2.     .usage('Usage: $0  [options]') 
  3.     .alias('h', 'help') 
  4.     .argv; 

 訪(fǎng)問(wèn)argv.h相當(dāng)于訪(fǎng)問(wèn)argv.help

參數(shù)數(shù)組

 
 
  1. var argv = require('yargs') 
  2.     .usage('Usage: $0  [options]') 
  3.     .alias('n', 'name') 
  4.     .array('n') 
  5.     .argv; 
  6.  
  7. console.log(argv.n); 

 調(diào)用

 
 
  1. node array_test.js -n abc test 

設(shè)置參數(shù)范圍

 
 
  1. var argv = require('yargs') 
  2.   .alias('i', 'ingredient') 
  3.   .describe('i', 'choose your sandwich ingredients') 
  4.   .choices('i', ['peanut-butter', 'jelly', 'banana', 'pickles']) 
  5.   .help('help') 
  6.   .argv 

 上述代碼設(shè)定argv.i的值只能是['peanut-butter', 'jelly', 'banana', 'pickles']數(shù)組中的一個(gè)

上面是yargs比較簡(jiǎn)單的用法,如果想閱讀完整版,建議去github上閱讀

子命令

yargs適合開(kāi)發(fā)復(fù)雜的命令行程序的另一個(gè)原因是它支持子命令,而且子命令可以嵌套,這意味著你也可以開(kāi)發(fā)出類(lèi)似git這樣擁有上百個(gè)命令的程序

yargs的子命令有兩種模式:.command(*)和.commandDir(directory, [opts])

.command

 
 
  1. .command方法有三個(gè)接口 
  2.  
  3. .command(cmd, desc, [builder], [handler]) 
  4.  
  5. .command(cmd, desc, [module]) 
  6.  
  7. .command(module) 

其實(shí)它們的用法都差不多,可以把它們都看作傳遞一個(gè)module給yargs,這個(gè)module必須導(dǎo)出四個(gè)變量cmd, desc [builder], [handler],其中builder和handler是方法,另外兩個(gè)是字符串

使用***個(gè)接口的示例

 
 
  1. yargs 
  2.   .command( 
  3.     'get', 
  4.     'make a get HTTP request', 
  5.     function (yargs) { 
  6.       return yargs.option('u', { 
  7.         alias: 'url', 
  8.         describe: 'the URL to make an HTTP request to' 
  9.       }) 
  10.     }, 
  11.     function (argv) { 
  12.       console.log(argv.url) 
  13.     } 
  14.   ) 
  15.   .help() 
  16.   .argv  

使用第三個(gè)接口需要把這個(gè)模塊在單獨(dú)的文件,然后用require引入

這是模塊的代碼

 
 
  1. // my-module.js 
  2. exports.command = 'get  [proxy]' 
  3.  
  4. exports.describe = 'make a get HTTP request' 
  5.  
  6. exports.builder = { 
  7.   banana: { 
  8.     default: 'cool' 
  9.   }, 
  10.   batman: { 
  11.     default: 'sad' 
  12.   } 
  13.  
  14. exports.handler = function (argv) { 
  15.   // do something with argv. 
  16. }  

引入的時(shí)候這樣使用

 
 
  1. yargs.command(require('my-module')) 
  2.   .help() 
  3.   .argv 

 當(dāng)額外的模塊沒(méi)有定義cmd和desc的時(shí)候可以使用第二個(gè)接口

 
 
  1. yargs.command('get  [proxy]', 'make a get HTTP request', require('my-module')) 
  2.   .help() 
  3.   .argv 

 這里建議使用第三個(gè)接口,這樣能保持模塊的內(nèi)聚,這種模塊你能掛載在任何命令下面,遷移的時(shí)候不需要修改模塊代碼,只需要修改引入模塊的代碼就能實(shí)現(xiàn)

.commandDir

如果有大量的命令都使用上面的.command(module)來(lái)開(kāi)發(fā)的話(huà),這些模塊都有相同的結(jié)構(gòu),應(yīng)該能有方法簡(jiǎn)化這些命令的引入過(guò)程,把這個(gè)過(guò)程自動(dòng)化,基于 這個(gè)目的yargs提供了.commandDir接口

下面參考一個(gè)我自己寫(xiě)的項(xiàng)目pit

下面是這個(gè)項(xiàng)目的目錄結(jié)構(gòu)

 
 
  1.  
  2. ├── pit 
  3.  
  4. │ ├── douban 
  5.  
  6. │ │ └── movie.js 
  7.  
  8. │ ├── douban.js 
  9.  
  10. │ ├── gg 
  11.  
  12. │ │ ├── client.js 
  13.  
  14. │ │ ├── login.js 
  15.  
  16. │ │ ├── scope.js 
  17.  
  18. │ │ ├── scope.json 
  19.  
  20. │ │ ├── secret.json 
  21.  
  22. │ │ ├── token.json 
  23.  
  24. │ │ └── upload.js 
  25.  
  26. │ ├── gg.js 
  27.  
  28. │ ├── git 
  29.  
  30. │ │ ├── commit.js 
  31.  
  32. │ │ ├── create.js 
  33.  
  34. │ │ ├── deploy.js 
  35.  
  36. │ │ ├── push.js 
  37.  
  38. │ │ └── token.json 
  39.  
  40. │ ├── git.js 
  41.  
  42. │ ├── gm.js 
  43.  
  44. │ ├── md5.js 
  45.  
  46. │ ├── news 
  47.  
  48. │ │ ├── bing.js 
  49.  
  50. │ │ ├── funs.js 
  51.  
  52. │ │ ├── funs.json 
  53.  
  54. │ │ ├── games.js 
  55.  
  56. │ │ ├── games.json 
  57.  
  58. │ │ ├── google.js 
  59.  
  60. │ │ ├── newsall.json 
  61.  
  62. │ │ ├── shops.js 
  63.  
  64. │ │ ├── shops.json 
  65.  
  66. │ │ ├── videos.js 
  67.  
  68. │ │ └── videos.json 
  69.  
  70. │ └── news.js 
  71.  
  72. └── pit.js 

 pit.js:命令行的入口

 
 
  1. #!/usr/bin/env node 
  2.  
  3. require('yargs') 
  4.   .commandDir('pit') 
  5.   .demand(1) 
  6.   .help() 
  7.   .locale('en') 
  8.   .showHelpOnFail(true, 'Specify --help for available options') 
  9.   .argv 
  10. ··· 

這段代碼只指定讀取同目錄下同名文件夾`pit`下面的命令加載為子命令

> **注意**:commandDir默認(rèn)只會(huì)加載目錄下***級(jí)的文件,不會(huì)遞歸加載,如果想遞歸加載需要這樣寫(xiě)`.commandDir('pit', {recurse: true})`

接著來(lái)看git子命令,因?yàn)間it項(xiàng)目每次提交都要重復(fù)幾個(gè)相同的步驟,所有想開(kāi)發(fā)一個(gè)更簡(jiǎn)單的命令進(jìn)行打包提交

git.js

 
 
  1. exports.command = 'git '; 
  2.  
  3. exports.desc = 'github command list'; 
  4.  
  5. exports.builder = function (yargs) { return yargs.commandDir('git') } 
  6.  
  7. exports.handler = function (argv) {} 

 git也是加載一個(gè)目錄作為自己的子命令:以commit為例

commit.js

 
 
  1. 'use strict'; 
  2.  
  3. var fs = require('fs'); var path = require('path'); 
  4.  
  5. require('shelljs/global'); 
  6.  
  7. var Q = require('q'); 
  8.  
  9. function _exec(cmd) { var deferred = Q.defer(); exec(cmd, function (code, stdout, stderr) { deferred.resolve(); }); return deferred.promise; } 
  10.  
  11. exports.command = 'commit'; 
  12.  
  13. exports.desc = 'commit repo local'; 
  14.  
  15. exports.builder = function (yargs) { return yargs .help('h'); }; 
  16.  
  17. exports.handler = function (argv) { var repo = process.cwd(); var name = path.basename(repo); Q.fcall(function () { }) .then(() => _exec(git add .)) .then(() => _exec(git commit -m 'd')) .catch(function (err) { console.log(err); }) .done(() => { console.log(commit ${repo} done); }); 
  18.  
  19. } ``` 

 這個(gè)命令默認(rèn)運(yùn)行在git項(xiàng)目的根目錄,和git命令不太一樣,git可以在項(xiàng)目根目錄下的任意子目錄里面運(yùn)行。

使用shelljs來(lái)運(yùn)行子命令,然后用Q進(jìn)行promise封裝,保證命令的執(zhí)行順序,同時(shí)把命令行輸出和錯(cuò)誤信息都打印到 控制。

一個(gè)很簡(jiǎn)單能節(jié)省時(shí)間的命令行程序,作為拋磚引玉之用

延伸

高手都是擅長(zhǎng)使用命令行(電影里面的高手也一樣),當(dāng)你習(xí)慣使用命令行完成日常任務(wù)之后,慢慢的會(huì)形成一種依賴(lài)。繼續(xù)下去,你會(huì)考慮把所有的事情都用來(lái)命令行來(lái)完成,當(dāng)然這個(gè) 目的不能實(shí)現(xiàn),因?yàn)槟茏詣?dòng)完成所有任務(wù)的命令行不叫命令行——它叫AI

雖然不能開(kāi)發(fā)一臺(tái)高智能ai,但是還是有很多任務(wù)能用命令行來(lái)完成的,這里寫(xiě)下我的思路,供大家參考

api命令行

大型網(wǎng)站都提供自己的api接口配上oauth2.0認(rèn)證,如果你想使用命令行來(lái)調(diào)用這些api接口,你完全可以做到

像aws,google cloud,aliyun這種云主機(jī),使用命令行能節(jié)省很多運(yùn)維的時(shí)間

另外你也可以參考上面pit.js寫(xiě)的douban.js來(lái)抓取豆瓣的數(shù)據(jù),豆瓣的公共api不需要認(rèn)證就能訪(fǎng)問(wèn),用來(lái)做一些測(cè)試非常方便

命令行爬蟲(chóng)

使用node.js開(kāi)發(fā)爬蟲(chóng)就像使用python一樣簡(jiǎn)單,但是一個(gè)功能齊全的爬蟲(chóng)必然少不了命令行接口,你不可能每次有新的需求都來(lái)修改代碼,下次再給大家分享我寫(xiě)的一個(gè)簡(jiǎn)單的基于 node.js的爬蟲(chóng)項(xiàng)目

表單提交

對(duì)一些不提供api接口但是又想使用命令來(lái)進(jìn)行交互的網(wǎng)站,你可以使用表單提交來(lái)進(jìn)行登錄,然后做一些登錄之后才能做的事情:例如發(fā)表文章

現(xiàn)在很多的網(wǎng)站都支持使用markdown編輯文章,然后發(fā)布,對(duì)這一類(lèi)網(wǎng)站你都可以開(kāi)發(fā)自己的命令行統(tǒng)一進(jìn)行管理,當(dāng)你寫(xiě)完文章之后,只需要一個(gè)簡(jiǎn)單 的命令,就能把文章同時(shí)推送到各大網(wǎng)站


本文題目:從零開(kāi)始打造個(gè)人專(zhuān)屬命令行工具集——yargs完全指南
URL地址:http://m.5511xx.com/article/djgggje.html