開發(fā)自己的nodejs命令行工具并使用工具(nodejs 開發(fā)工具)
需求來源于生活。
在日常開發(fā)中,經(jīng)常會頻繁地做一些重復性的操作,作為一名程序員,解放雙手的時刻到了。
比如說:批量修改某些文件的后綴,我對于一些shell或者win下的命令不是很熟悉,稍微了解的就是自己的開發(fā)語言,所以用熟悉的工具做事還是可以帶來一些成就感的。
下面我準備針對這個小小的需求開發(fā)一個自己的命令行,當然如果能幫助到其他人,那就更加地滿足了。閑話不多說,下面直接開始。
需求整理
- 可以對某個文件夾下的所有文件進行后綴的修改
- 可以限定某類后綴修改為指定的后綴
- 可以指定目標文件夾
- 同時可以隨機重命名
準備
環(huán)境 : nodejs編輯工具 : sublime
大體流程
- 在github上創(chuàng)建自己想要的倉庫changeext(命名)
- 將倉庫clone到本地進行開發(fā)、測試
- 發(fā)布到github
- 發(fā)布到npm
- 安裝到本地進行使用大功告成
步驟分解
一些帳號注冊、倉庫創(chuàng)建就不再說了,主要說下開發(fā)的具體流程 先來一段偽代碼:
1.確定目標文件夾、一些相關(guān)的參數(shù)(是否重命名、源后綴、目標后綴)2.獲得目標文件夾下的所有文件(符合源后綴)3.對符合條件的文件進行重命名(修改后綴)4.結(jié)束,對,流程很簡單,實現(xiàn)起來也不麻煩,但是起碼這是自己的小工具啊,哪怕網(wǎng)上再多也是別人的
開發(fā)中使用的module:
minimist(命令行參數(shù)處理) fs(操作文件) path(處理文件路徑) colors(讓打印信息更加好看)
核心代碼如下:
#!/usr/bin/env node//作為命令行工具,第一行就是上面的這貨,千萬別少了var fs = require('fs');var path = require('path');var colors = require('colors');//指定一些顏色信息colors.setTheme({ error : 'red', success : 'green', info : 'yellow'});//獲得命令行的參數(shù)var argv = require("minimist")(process.argv.slice(2), { alias: { 'input': 'i', 'target': 't', 'directory': 'd', 'loop' : 'l', 'random' : 'r' }, string: ['input', 'target','directory'], boolean : ['loop','random'], 'default': { 'directory': process.cwd() }});//打印幫助信息if (argv.help) { console.log("Usage:".info); console.log(" changeext --help // print help information".success); console.log(" changeext txt js // change 'txt' to 'js' ".success); console.log(" changeext -i txt // input file extensions".success); console.log(" changeext -t js // target file extensions".success); console.log(" changeext -d /home/ // target directory for change".success); console.log(" changeext -l // loop file directory for change file extensions".success); console.log(" changeext txt js -r // get some random name"); process.exit(0);}//隨機獲得一個隨機字符串function getRandom(){ var counter = 0; return (function() { var guid = ( new Date()).toString( 32 ),i = 0; for ( ; i < 5; i ) { guid = Math.floor( Math.random() * 65535 ).toString( 32 ); } return guid (counter ).toString( 32 ); })();}//重命名function rename (folderPath,input,target,loop){ fs.stat(folderPath,function(err,stats){ if(err){ console.log(err); }else{ if(stats.isDirectory()){ if(loop === true && argv.loop === false){ return false; } if(loop === false && argv.loop === false){//不需要循環(huán),但是目標路徑為文件夾 loop = true; } fs.readdir(folderPath,function(err2,files){ if(err2){ console.log(err2); }else{ if(files && files.length > 0){ files.forEach(function(filename,index){ rename(path.join(folderPath,filename),input,target,loop); }); } } }); }else{ var extname = path.extname(folderPath); input = input.startsWith('.') || input == '' ? input : '.' input; target = target.startsWith('.') || target == '' ? target : '.' target; extname = extname.toLowerCase(); input = input.toLowerCase(); target = target.toLowerCase(); if(extname === input){ var newPath = ""; if(argv.random){ var randomName = getRandom() target; newPath = path.join(path.dirname(folderPath),randomName); }else{ newPath = folderPath.substring(0,folderPath.length - extname.length) target; } fs.rename(folderPath,newPath,function(err){ if(err){ console.log(err); }else{ console.log('Rename file : ' folderPath.info ' => ' newPath.info ' success.'.success); } }); } } } });}//校驗if(argv.directory && fs.existsSync(argv.directory)){ if( (argv.input && argv.target) || (argv.input === '' && argv.target) || (argv.input && argv.target === '') ){ rename(argv.directory,argv.input,argv.target,argv.loop); }else{ if(argv._[0] && argv._[1]){ rename(argv.directory,argv._[0],argv._[1]); }else{ console.log('input file extensions and target file extensions must be not empty.'.error); process.exit(0); } }}else{ console.log('directory is not exists.'.error); process.exit(0);}
然后我們就針對代碼進行本地測試
image.png
OK,測試成功,然后把代碼發(fā)布到github(此處流程可以google),然后將自己的代碼發(fā)布到npm官網(wǎng)。
npm publish //這里經(jīng)常出問題 //1.首先,要注冊一個npm官網(wǎng)的帳號。 //2.然后登錄 npm login //3.確認帳號 npm whoami //4.發(fā)布即可。 有時候會發(fā)布報錯,可能的原因是 registry 改過了,只需要再改回來即可。 //npm config set registry http://registry.npmjs.orgnpm publish
然后,我們就可以開心地下載自己的工具來666了。
命令行工具:changeext
本文中的命令行工具為 changeext
可以很方便地變更指定后綴到目標后綴或重命名,同時附帶了一個簡單的加密,可以悄悄地隱藏文件咯,比如:
//全局安裝npm i changeext -g //將mp4 修改為 bin文件,并做簡單加密。默認是在當前執(zhí)行命令的目錄下查找并執(zhí)行changeext mp4 bin -e//如果要修改回來則是changeext bin mp4 -e