精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Node交互式命令行工具開發——自動化文檔工具

開發 開發工具 自動化
nodejs開發命令行工具,流程相對簡單,但一套完整的命令行程序開發流程下來,還是需要下點功夫,網上資料大多零散,這篇教程意在整合一下完整的開發流程。

[[390895]]

nodejs開發命令行工具,流程相對簡單,但一套完整的命令行程序開發流程下來,還是需要下點功夫,網上資料大多零散,這篇教程意在整合一下完整的開發流程。

npm上命令行開發相關包很多,例如minimist、optimist、nopt、commander.js、yargs等等,使用方法和效果類似。其中用得比較多的是TJ大神的commander和yargs,本文以commander為基礎講述,可以參考這篇教程,yargs教程可以參考阮大神的或者這一篇。

另外,一個完整的命令行工具開發,還需要了解process、shelljs、path、linebyline等模塊,這些都是node基礎模塊或一些簡單模塊,非常簡單,就不多說了,另外如果你不想用回調函數處理異步還需要了解一下Promise、Generator函數。這是教程:i5ting大神的《深入淺出js(Node.js)異步流程控制》和阮大神的異步編程教程以及promise小人書,另外想嘗試ES7 stage3階段的async/await異步解決方案,可參考這篇教程,async/await解決方案需要babel轉碼,這是教程。本人喜歡async/await(哪個node開發者不喜歡呢?)但不喜歡倒騰,況且async/await本身就是Promise的語法糖,所以沒選擇使用,據江湖消息,nodejs將在今年晚些時候(10月份?)支持async/await,很是期待。

以下是文章末尾實例用到的一些依賴。 

  1. "dependencies": {  
  2.     "bluebird": "^3.4.1",  
  3.     "co": "^4.6.0",  
  4.     "colors": "^1.1.2",  
  5.     "commander": "^2.9.0",  
  6.     "dox": "^0.9.0",  
  7.     "handlebars": "^4.0.5",  
  8.     "linebyline": "^1.3.0",  
  9.     "mkdirp": "^0.5.1"  
  10.   } 

其中bluebird用于Promise化,TJ大神的co用于執行Generator函數,handlebars是一種模板,linebyline用于分行讀取文件,colors用于美化輸出,mkdirp用于創建目錄,另外教程中的示例是一款工具,可以自動化生成數據庫和API接口的markdown文檔,并通過修改git hooks,使項目的每次commit都會自動更新文檔,借助了TJ大神的dox模塊。

<span style="color:rgb(0, 136, 204)">所有推薦教程/教材,僅供參考,自行甄選閱讀。</span>

安裝Node

各操作系統下安裝見Nodejs官網,安裝完成之后用node -v或者which node等命令測試安裝是否成功。which在命令行開發中是一個非常有用的命令,使用which命令確保你的系統中不存在名字相同的命令行工具,例如which commandName,例如which testdev命令返回空白那么說明testdev命令名稱還沒有被使用。

初始化

新建一個.js文件,即是你的命令要執行的主程序入口文件,例如testdev.js。在文件第一行加入#!/usr/bin/env node指明系統在運行這個文件的時候使用node作為解釋器,等價于node testdev.js命令。

初始化package.json文件,使用npm init命令根據提示信息創建,也可以是使用npm init -y使用默認設置創建。創建完成之后需要修改package.json文件內容加入"bin": {"testdev": "./testdev.js"}這條信息用于告訴npm你的命令(testdev)要執行的腳本文件的路徑和名字,這里我們指定testdev命令的執行文件為當前目錄下的testdev.js文件。

為了方便測試在testdev.js文件中加入代碼console.log('hello world');,這里只是用于測試環境是否搭建成功,更加復雜的程序邏輯和過程需要按照實際情況進行編寫

測試

使用npm link命令,可以在本地安裝剛剛創建的包,然后就可以用testdev來運行命令了,如果正常的話在控制臺會打印出hello world

commander

TJ的commander非常簡潔,README.md已經把使用方法寫的非常清晰。下面是例子中的代碼: 

  1. const program = require('commander'),  
  2.   co = require('co');  
  3. const appInfo = require('./../package.json'),  
  4.   asyncFunc = require('./../common/asyncfunc.js');  
  5. program.allowUnknownOption();  
  6. program.version(appInfo.version);  
  7. program  
  8.   .command('init')  
  9.   .description('初始化當前目錄doc.json文件')  
  10.   .action(() => co(asyncFunc.initAction));  
  11. program  
  12.   .command('show')  
  13.   .description('顯示配置文件狀態')  
  14.   .action(() => co(asyncFunc.showAction));  
  15. program  
  16.   .command('run')  
  17.   .description('啟動程序')  
  18.   .action(() => co(asyncFunc.runAction));  
  19. program  
  20.   .command('modifyhook')  
  21.   .description('修改項目下的hook文件')  
  22.   .action(() => co(asyncFunc.modifyhookAction));  
  23. program  
  24.   .command('*')  
  25.   .action((env) => {  
  26.     console.error('不存在命令 "%s"', env);  
  27.   });  
  28. program.on('--help', () => {  
  29.   console.log('  Examples:');  
  30.   console.log('');  
  31.   console.log('    $ createDOC --help');  
  32.   console.log('    $ createDOC -h');  
  33.   console.log('    $ createDOC show');  
  34.   console.log('');  
  35. });  
  36. program.parse(process.argv); 

定義了四個命令和個性化幫助說明。

交互式命令行process

commander只是實現了命令行參數與回復一對一的固定功能,也就是一個命令必然對應一個回復,那如何實現人機交互式的命令行呢,類似npm init或者eslint --init這樣的與用戶交互,交互之后根據用戶的不同需求反饋不同的結果呢。這里就需要node內置的process模塊。

這是我實現的一個init命令功能代碼: 

  1. exports.initAction = function* () {  
  2.   try {  
  3.     var docPath = yield exists(process.cwd() + '/doc.json');  
  4.     if (docPath) {  
  5.       func.initRepl(config.coverInit, arr => {  
  6.         co(newDoc(arr));  
  7.       })  
  8.     } else {  
  9.       func.initRepl(config.newInit, arr => {  
  10.         co(newDoc(arr));  
  11.       })  
  12.     }  
  13.   } catch (err) {  
  14.     console.warn(err);  
  15.   } 

首先檢查doc.json文件是否存在,如果存在執行覆蓋交互,如果不存在執行生成交互,try...catch捕獲錯誤。

交互內容配置如下:   

  1. newInit:  
  2.     [  
  3.         {  
  4.             title:'initConfirm',  
  5.             description:'初始化createDOC,生成doc.json.確認?(y/n)  ',  
  6.             defaults: 'y'  
  7.         },  
  8.         {  
  9.             title:'defaultConfirm',  
  10.             description:'是否使用默認配置.(y/n)  ',  
  11.             defaults: 'y'  
  12.         },  
  13.         {  
  14.             title:'showConfig',  
  15.             description:'是否顯示doc.json當前配置?(y/n)  ',  
  16.             defaults: 'y'  
  17.         }  
  18.     ],  
  19.     coverInit:[  
  20.         {  
  21.             title:'modifyConfirm',  
  22.             description:'doc.json已存在,初始化將覆蓋文件.確認?(y/n)  ',  
  23.             defaults: 'y' 
  24.         },  
  25.         {  
  26.             title:'defaultConfirm',  
  27.             description:'是否使用默認配置.(y/n)  ',  
  28.             defaults: 'y'  
  29.         },  
  30.         {  
  31.             title:'showConfig',  
  32.             description:'是否顯示doc.json當前配置?(y/n)  ',  
  33.             defaults: 'y'  
  34.         }  
  35.     ], 

人機交互部分代碼也就是initRepl函數內容如下: 

  1. //初始化命令,人機交互控制  
  2. exports.initRepl = function (init, func) {  
  3.   var i = 1 
  4.   var inputArr = [];  
  5.   var len = init.length;  
  6.   process.stdout.write(init[0].description);  
  7.   process.stdin.resume();  
  8.   process.stdin.setEncoding('utf-8');  
  9.   process.stdin.on('data', (chunk) => {  
  10.     chunkchunk = chunk.replace(/[\s\n]/, '');  
  11.     if (chunk !== 'y' && chunk !== 'Y' && chunk !== 'n' && chunk !== 'N') {  
  12.       console.log(config.colors.red('您輸入的命令是: ' + chunk));  
  13.       console.warn(config.colors.red('請輸入正確指令:y/n'));  
  14.       process.exit();  
  15.     }  
  16.     if (  
  17.       (init[i - 1].title === 'modifyConfirm' || init[i - 1].title === 'initConfirm') &&  
  18.       (chunk === 'n' || chunk === 'N')  
  19.     ) {  
  20.       process.exit();  
  21.     }  
  22.     var inputJson = {  
  23.       title: init[i - 1].title,  
  24.       value: chunk,  
  25.     };  
  26.     inputArr.push(inputJson);  
  27.     if ((len--) > 1) {  
  28.       process.stdout.write(init[i++].description)  
  29.     } else { 
  30.       process.stdin.pause();  
  31.       func(inputArr);  
  32.     }  
  33.   });  

人機交互才用向用戶提問根據用戶不同輸入產生不同結果的形式進行,順序讀取提問列表并記錄用戶輸入結果,如果用戶輸入n/N則終止交互,用戶輸入非法字符(除y/Y/n/N以外)提示輸入命令錯誤。

文檔自動化

文檔自動化,其中數據庫文檔自動化,才用依賴sequelize的方法手寫(根據需求不同自行編寫邏輯),API文檔才用TJ的dox也很簡單。由于此處代碼與命令行功能相關度不大,請讀者自行去示例地址查看代碼。 

 

責任編輯:龐桂玉 來源: segmentfault
相關推薦

2019-01-03 09:06:55

Node.js命令行工具 前端

2024-04-26 09:44:39

2021-09-09 16:45:07

HTTP命令Linux

2019-06-10 15:00:27

node命令行前端

2020-12-11 06:44:16

命令行工具開發

2020-12-10 16:16:08

工具代碼開發

2018-05-04 09:15:35

PythonPlumbum命令行

2023-06-09 07:45:29

Kuberneteskubectl

2018-05-08 08:35:34

LinuxDocker 容器管理器

2015-10-14 17:59:53

Google數據探索交互開發

2010-11-24 17:12:17

MySQL命令行

2013-12-09 14:29:13

OpenStack命令行工具API

2011-01-18 19:11:26

Postfix命令行

2011-05-31 18:17:07

分布式測試

2011-05-30 17:50:23

分布式測試

2023-10-30 01:00:42

Go語言Cobra庫

2021-02-02 10:15:55

工具命令行Node

2010-12-09 21:46:26

Scapy

2013-11-15 09:43:15

JDK工具

2019-08-27 10:32:01

Linux操作系統Windows
點贊
收藏

51CTO技術棧公眾號

日韩av一二三四区| 国产999精品久久久影片官网| 182午夜在线观看| av电影在线播放高清免费观看| 欧美1区3d| 精品成人在线观看| 成人在线免费在线观看| 国产69久久| 免费亚洲电影在线| 日韩中文字幕视频在线观看| 污污视频网站在线| 国产黄色大片在线观看| 成人av在线影院| 日韩av免费在线| 99热这里只有精品4| 午夜电影一区| 亚洲777理论| 欧美日韩一区在线播放| 国产裸体无遮挡| 亚洲乱亚洲高清| 中文日韩电影网站| 奇米视频7777| 9765激情中文在线| 中文文精品字幕一区二区| 亚洲xxxxx性| 依依成人综合网| 老**午夜毛片一区二区三区 | 久久偷拍免费视频| 成人看片网页| 亚洲欧美aⅴ...| 国产一区二区黄色| 国产在线精品一区在线观看麻豆| 日韩欧美午夜| 亚洲高清不卡在线观看| 精品日本一区二区三区在线观看| 亚洲综合av一区| 国产99视频在线| 国产精品免费看| 久久综合伊人77777蜜臀| 玖草视频在线观看| 久久久久久亚洲精品美女| 色综合天天在线| www国产免费| 在线观看完整版免费| 成人av资源在线| 96pao国产成视频永久免费| 国产微拍精品一区| 清纯唯美亚洲综合一区| 欧美精品一区二区不卡| 中文字幕丰满乱码| 99久久er| 91久久精品国产91性色tv| 青青在线免费观看| 国产尤物视频在线| 91免费精品国自产拍在线不卡| 亚洲午夜精品久久久久久浪潮| 久久婷婷综合色| 国模雨婷捆绑高清在线| 久久婷婷国产综合国色天香| 91精品久久香蕉国产线看观看 | 欧美极品少妇xxxxⅹ高跟鞋| 不卡一区二区三区视频| 伊人久久一区二区| 老牛影视一区二区三区| 九九热精品视频国产| 老司机精品免费视频| 精品无人区麻豆乱码久久久| 亚洲国产99精品国自产| 日韩欧美色视频| 人人九九精品视频| 91精品在线一区二区| 国产真实乱子伦| 美女露胸视频在线观看| 亚洲香肠在线观看| 色婷婷777777仙踪林| 免费黄色在线网站| 中文字幕日韩一区| 亚洲日本无吗高清不卡| 亚洲搞黄视频| 国产精品乱人伦| 正在播放国产精品| 超碰在线网址| 亚洲综合久久久| 国产亚洲黄色片| 18视频在线观看| 一区二区三区精品视频| 女人被男人躁得好爽免费视频| 在线看福利影| 性久久久久久久| 欧美 日韩 国产一区| 亚洲成人看片| 欧美性受xxxx黑人xyx| 三级在线视频观看| 日本久久久久| 欧美大片日本大片免费观看| 欧美日韩综合在线免费观看| 欧美一区二区视频在线播放| 欧美人与牲禽动交com| 中文字幕一区二区三区在线播放 | 国产精品一品二品| 99在线高清视频在线播放| 午夜精品小视频| 本田岬高潮一区二区三区| 国内精品国语自产拍在线观看| 色一情一乱一乱一区91av| 久久综合九色综合97婷婷| 亚洲aⅴ天堂av在线电影软件| 成人在线免费看片| 黄色一区二区在线观看| 又色又爽又高潮免费视频国产| 国产成人a视频高清在线观看| 欧美一区二区三区喷汁尤物| 香港三日本8a三级少妇三级99| 久久爱www成人| 插插插亚洲综合网| 日韩 欧美 综合| 日本91福利区| 国产区一区二区| 欧美在线观看在线观看| 亚洲欧美在线高清| 日本精品免费在线观看| 看亚洲a级一级毛片| 日韩精品视频中文在线观看| 1024手机在线观看你懂的| 亚洲先锋影音| 日韩美女免费观看| 成人免费公开视频| 国产精品全国免费观看高清 | http;//www.99re视频| 内衣办公室在线| 一区二区三区免费网站| 久久九九国产视频| theporn国产在线精品| 一区二区在线视频| 日韩美女视频网站| 久久精品国产99国产精品| 国内精品视频免费| av免费在线观| 欧美午夜精品久久久久久孕妇| 国产精品扒开腿做爽爽爽a片唱戏| 在线视频亚洲专区| 久久久久久久久久久久av| 一级黄色免费看| 国产午夜精品久久| 无码人妻丰满熟妇区96| 玖玖玖电影综合影院| 中文字幕久久久av一区| 人人草在线观看| 99国内精品久久| 91黄色在线看| 国产精品久久久久久久久免费高清| 亚洲国产成人精品一区二区| 国产精品99久久久久久成人| 日产国产高清一区二区三区| 久久久久久久久久久一区 | 久久久亚洲欧洲日产国码αv| 一本一生久久a久久精品综合蜜| 日韩免费电影| 亚洲热线99精品视频| 99久在线精品99re8热| 不卡一区在线观看| 成人免费视频91| 国产精品视频首页| 精品国产视频在线| 在线视频 中文字幕| 日本一区二区综合亚洲| 青青青在线播放| 国产精东传媒成人av电影| 欧美超级乱淫片喷水| 国产伦精品一区二区三区视频痴汉| 中文字幕欧美区| 国产xxxxx在线观看| 偷拍亚洲精品| 日本欧美精品在线| 国产视频在线看| 欧美手机在线视频| av网站免费在线看| 日本一不卡视频| 中文字幕在线亚洲精品| 精品国模一区二区三区欧美| 欧美成人黑人xx视频免费观看| 国产美女永久免费| 亚洲一二三四区| 四季av综合网站| 香蕉亚洲视频| 天堂精品一区二区三区| 午夜不卡一区| 欧美日本黄视频| 午夜视频在线免费播放| 欧美三级xxx| 中文字幕在线永久| 天堂影院一区二区| 一区二区三区四区视频在线观看 | 中文字幕在线永久| 视频一区二区国产| 亚洲精品高清国产一线久久| 国产精品日本一区二区三区在线| 欧美精品激情blacked18| 午夜激情在线视频| 精品视频在线免费观看| 日日骚一区二区三区| 99视频在线精品| 天天操天天爱天天爽| 欧美一区二区| 免费日韩av电影| 日韩毛片网站| 欧美性在线观看| 免费黄色在线看| 亚洲国产成人久久| 亚洲av人无码激艳猛片服务器| 国产精品久久一级| 欧美日韩人妻精品一区在线| 日本人妖一区二区| 久操网在线观看| 成人久久综合| 久久精品国产精品国产精品污 | 中文字幕在线一区免费| 国内精品免费视频| 免费人成黄页网站在线一区二区 | 手机视频在线观看| 欧美三级第一页| 亚洲国产精品视频一区| 国产 日韩 欧美 综合 一区| 国产精品久久久久久超碰| 国产网友自拍视频导航网站在线观看 | 精品国产精品网麻豆系列 | 欧美一区二区三区性视频| 日韩精品在线免费看| 亚洲青青青在线视频| 免费在线观看你懂的| 国产一区亚洲一区| 超碰av在线免费观看| 日韩视频精品在线观看| 大桥未久一区二区| 成人黄色小视频| 美国av一区二区三区| 一本色道69色精品综合久久| 国产精品a久久久久久| 成全电影大全在线观看| 成年人精品视频| 亚洲xxxxxx| 亚洲日韩欧美视频| 色呦呦中文字幕| 日韩三级电影网址| 免费精品一区二区| 欧美视频在线免费看| 日产精品久久久久| 《视频一区视频二区| 国产sm调教视频| 久久久久国产精品麻豆| 在线精品视频播放| 国产成人午夜电影网| 九九九九九国产| 青青草原综合久久大伊人精品优势| 国产女大学生av| 黄色精品一区| 欧美黄网在线观看| 欧美日韩国产欧| www.日本三级| 伊人精品成人久久综合软件| 成年人视频网站免费| 99av国产精品欲麻豆| 人妻少妇被粗大爽9797pw| 午夜在线播放视频欧美| 欧美日韩在线免费播放| 蜜桃精品视频在线观看| 国产毛片久久久久久| 国产精品小仙女| 四虎成人免费视频| 91免费看视频| 老司机深夜福利网站| 亚洲欧美偷拍三级| 国产第一页在线播放| 欧美午夜性色大片在线观看| 日本熟妇一区二区三区| 56国语精品自产拍在线观看| 国产成人三级在线观看视频| 日韩精品免费在线播放| 懂色av中文在线| 久久成人av网站| 伊人网在线播放| 国产美女久久精品香蕉69| 精品视频在线观看免费观看 | 婷婷五月综合久久中文字幕| 亚洲人成电影网站色…| 国产在线激情| 午夜剧场成人观在线视频免费观看| 国产高清不卡| 亚洲自拍欧美另类| 天堂av一区二区三区在线播放| 午夜视频久久久| 亚洲小说欧美另类社区| 免费激情视频在线观看| 国产精一品亚洲二区在线视频| 看全色黄大色黄女片18| 国产精品午夜在线| 国产奶水涨喷在线播放| 欧美午夜在线观看| 欧美一级视频免费| 日韩在线观看免费全集电视剧网站| 污污视频在线| 国产精品久久久久久久久久久久久 | 欧美精品91| 久久久久国产精品熟女影院| 国产成人8x视频一区二区| 一级在线观看视频| 精品福利在线看| 国产精品一区二区av白丝下载 | 玖玖玖精品中文字幕| 91精品综合| 成人3d动漫一区二区三区| 国产成人99久久亚洲综合精品| 91麻豆精品国产91久久综合| 午夜日韩在线观看| 国产高清不卡视频| 亚洲人成网站777色婷婷| 秋霞在线午夜| 成人网中文字幕| 日韩av久操| 成人一级片网站| 国产suv一区二区三区88区| 日韩欧美在线视频播放| 大伊人狠狠躁夜夜躁av一区| 成人av免费播放| 久久精品国产亚洲精品2020| 小草在线视频免费播放| 国产精品日韩一区二区三区| 欧美在线观看天堂一区二区三区| 韩国视频一区二区三区| 91看片淫黄大片一级| 91精品国产乱码在线观看| 日韩午夜av一区| 欧美天天影院| 国产精品吴梦梦| 欧美一站二站| 国产又猛又黄的视频| 国产日韩精品一区二区三区在线| 国产精品100| 日韩av在线高清| 成人bbav| 久久精品人人做人人爽电影| 亚洲激精日韩激精欧美精品| 337p日本欧洲亚洲大胆张筱雨| 亚洲人精品一区| 国产女人爽到高潮a毛片| 色伦专区97中文字幕| 久久福利在线| 一本色道婷婷久久欧美| 精品中文av资源站在线观看| 国产一区在线观看免费| 在线播放中文字幕一区| 黄色av免费在线| 91情侣在线视频| 激情综合自拍| 99久久人妻无码中文字幕系列| 五月天中文字幕一区二区| 日本高清视频免费看| 欧美性受xxx| 国产一区三区在线播放| 精品久久久久久久无码| 中文字幕免费一区| 一级片视频网站| 精品视频9999| 欧美顶级毛片在线播放| 国产精品第12页| 亚洲国产精品传媒在线观看| 91麻豆一区二区| 欧美成人中文字幕在线| 国产精品自在线拍| 麻豆av免费在线| 国产精品美女久久福利网站| 国产精品久久影视| 午夜精品一区二区三区在线| 亚洲免费福利一区| 色婷婷成人在线| 一区二区三区日韩精品视频| 天堂网在线播放| 国产精自产拍久久久久久| 欧美99在线视频观看| 国产十八熟妇av成人一区| 91官网在线免费观看| 黄色网在线播放| 国产亚洲欧美另类一区二区三区| 亚洲一区二区免费看| 免费看91的网站| 日韩一区二区在线观看| 性欧美xxx69hd高清| 亚洲精品人成| 不卡一卡二卡三乱码免费网站| 波多野结衣人妻| 欧美激情按摩在线| 欧美理论视频| 一起草最新网址| 色噜噜夜夜夜综合网| 直接在线观看的三级网址| 免费在线成人av电影| 激情都市一区二区| 精品在线播放视频| 欧美大片va欧美在线播放| 国产精品一线天粉嫩av|