命令行工具對於咱們來講很是的熟悉,一些命令行的操做也極大的簡化了咱們的平常工做。本文就基於我寫的一個Node命令行代碼計數器來進行展開。javascript
相信熟悉linux系統的,對於一些ps,grep,cp,mv…等命令用起來應該愛不釋手,這也是我想要開發一個便捷命令行的初衷,其次就是記錄一個完整開源小玩具的全過程。html
命令行的特色:java
看了一下當前的一些命令行有如下問題node
所以這一款高顏值方便的統計工具誕生。linux
高顏圖
git
玩具源碼github
https://github.com/hua1995116...shell
第三方庫npm
dev庫(用來測試)json
Node兼容性
靜態文件
經過commander來獲取用戶的一些自定義配置
program .version('0.1.0') .option('-i, --ignore [dir]', 'ignore dir') .option('-p, --path [dir]', 'ignore dir') .parse(process.argv);
Node遍歷文件,每種語言行數信息
function getFile(dirPath) { const files = fs.readdirSync(dirPath); files.forEach((item) => { ... }) }
ignore過濾輸出到cache
function handleIgnode(cPath) { try { const currentPath = path.join(ROOTPATH, '.gitignore'); const fileData = fs.readFileSync(currentPath, 'utf-8'); const ignoreList = fileData.split('\n'); const filterList = filterData(ignoreList); const ig = ignore().add(filterList); return ig.ignores(cPath); } catch (e) { return false; } }
遍歷cache,統計max-line,進行colors
function hanldeTable(){ ... if (maxCount < langInfo[item].totalLines) { maxCount = langInfo[item].totalLines; maxIndex = index; } ... }
cli-table 輸出展現
function outputTbale() { const { header, content, bottom } = initTable(); const { totalFiles, totalCode, totalBlank, tablesContent } = hanldeTable(); ... console.log(`T=${totalTime} s`, `(${fileSpeed} files/s`, `${lineSpeed} lines/s)`) console.log(header.toString()) console.log(content.toString()) console.log(bottom.toString()) }
loading
對於多文件目錄,提供loading
lass StreamLoad { constructor(option) { this.stream = option.stream; this.text = option.text; this.clearLine = 0; } setValue(value) { this.text = value; this.render(); } render() { this.clear(); this.clearLine++; this.stream.write(`read ${this.text} file\n`); } clear() { if(!this.stream.isTTY) { return this; } for (let i = 0; i < this.clearLine; i++) { this.stream.moveCursor(0, -1); this.stream.clearLine(); this.stream.cursorTo(0); } this.clearLine = 0; } } const progress = new StreamLoad({ stream: process.stderr, text: 0 })
建立了一個實現loading的類。主要用到readline中的處理方法,詳見https://nodejs.org/dist/latest-v8.x/docs/api/readline.html#readline_readline_movecursor_stream_dx_dy
babel
對於低版本node的兼容
cnpm i babel-cli
package.json
"build": "./node_modules/.bin/babel src --out-dir lib"
chai,mocha
用來測試遍歷文件是否正確
const path = require('path'); const assert = require('chai').assert; const {getFileData} = require('../src/linec'); describe('linec files test', () => { it('can linec dir', () => { const url = path.join(__dirname, '../example'); console.log(url); const dirObj = JSON.stringify(getFileData(url)); const expectData = '{"CSS":{"file":1,"blankLines":0,"totalLines":4,"color":"#563d7c"},"JavaScript":{"file":1,"blankLines":0,"totalLines":1,"color":"#f1e05a"},"JSON":{"file":1,"blankLines":0,"totalLines":3,"color":"#fff"},"Markdown":{"file":1,"blankLines":0,"totalLines":1,"color":"#fff"}}'; assert.equal(dirObj, expectData); }) })
運行
./node_modules/mocha/bin/mocha
本項目中還添加了代碼覆蓋率的測試,所以是這樣的
"test": "./node_modules/.bin/istanbul cover node_modules/mocha/bin/_mocha && ./node_modules/.bin/codecov",
Step1
打開https://www.npmjs.com/signup
註冊一個帳號
step2
若是有帳號直接到這一步
npm login
step3
在package.json中介入version
{ "name": "linec", "version": "1.2.4", "description": "line count", "main": "index.js", ... }
step4
npm publish
Tip:注意每次發版須要更改package.json 中的version,否則會發版失敗哦。
package.json
"bin": { "linec": "./lib/index.js" },
本地項目命令行
npm link
就可使用linec 命令,將linec命令軟鏈接到本地,linec這個名字能夠自定義。
遠端命令行
默認就是包名字,可是若是bin裏面定義了一個名字,同上,能夠修更名字。也就是包名能夠和命令不一致,可是爲了更方便的使用,我的建議統一包名和命令。
詳情能夠參考 http://www.ruanyifeng.com/blo...
配置.travis.yml
language: node_js node_js: - "stable" sudo: false before_script: - npm install
這個是個人配置,每次你的提交,只要含有npm run test命令,travis會自動調用,自動檢測。
travis還有個好處,在別人給你提交pr的時候,能夠自動運行測試用例,避免一些低級錯誤的發生。如下就是效果圖。
這是一個統計代碼覆蓋率的工具,在npm run test中添加他,在pr的時候能夠看到覆蓋率的統計
$ npm install -g linec / cnpm install -g linec
$ linec
工具源碼(歡迎star) https://github.com/hua1995116...
以上就是所有內容,可能對於Node工具開發我可能仍是處於初出茅廬的階段,有更規範的操做,歡迎大佬們給我指正。