用Node开发自己的命令行

Home文章
 简介:本文主要介绍基于window下powershell,构建node命令

背景说明:

1、项目需要上传文件到cms系统

2、功能:单个上传和目录下所有文件上传

3、支持hash

 

线上demo

 

需求技术分析:

1、上传文件主要是post发送,需要form-data包,不做详解

2、计算文件hash值需要 crypto,不需要太复杂手写即可

3、目录上传需要列出所有目录下的文件,使用npm包 file-lister

4、目录下文件上传太多有风险,需要再次确认上传,使用npm包 confirm-simple

5、命令行提示太单调,容易疲乏,需要颜色美化点缀些文字图标,npm包colour

6、小组内使用,可以统一配置成powershell,主要是输入带提示

7、输入尽可能的支持多种方式,灵活,支持简写

8、尽可能少用一些包,比较没钱发布到npm,更新麻烦

9、容错或提示全面

10、上传文件记录到文本日志,方便查看

 

代码1:包加载

const uploader = require('./octopus-uploader.js');
const crypto = require('crypto');
const listFiles = require('file-lister');
const program = require('commander');
const path = require('path');
const fs = require('fs');
const colour = require('colour');
const confirm = require('confirm-simple');

 

代码2:解析命令行

//目录:{ dir: true, hash: true, fs: [ '.\\dev\\img\\finance' ] }
//文件:{ dir: null, hash: null, fs: [ '.\\dev\\finance.html' ] }
var argvParse = (function(){
    var argv = process.argv;
    var result = {
        dir:null,
        hash:null,
        fs:[]
    };
    //console.log(argv);
    argv.forEach(function (el,n) {
        //console.log(el.indexOf('-'));
        if(n<2) return;
        if(el.indexOf('-')===0){
            if(el.match(/-d|-dh|-hd|-dir/)){
                result.dir = true;
            }
            if(el.match(/-h|-dh|-hd|-hash/)){
                result.hash = true;
            }
        }else{
            result.fs.push(el);
        }
    });
    console.log(result);
    return result;
})();

 

代码3 计算文件hash,不太复杂,取前5位即可

//获取文件Hash
function getHash(p,callback){
    fs.stat(p,function (err,stat) {
        if (err) {
            console.log(err.toString().yellow);
            return;
        }
        if (stat.isFile()) {
            var rs = fs.createReadStream(p);
            var hash = crypto.createHash('sha');
            rs.on('data', hash.update.bind(hash));
            rs.on('end', function () {
                var h = hash.digest('hex').slice(0, 5);
                callback(h);
            });
        }else{
            console.log('✗ '.yellow+p.yellow+' not a file'.yellow);
        }
    });

}

 

代码4 区分文件还是目录,区分是否hash

//上传目录
if(argvParse.dir&&argvParse.fs.length>0){
    listFiles(argvParse.fs, {maxDepth: 0},function(err,files){
        if (err) {
            console.log(err);
        } else {
            console.log('↪-------------------------------follow Will be uploaded-------------------------------------->'.green);
            files.forEach(function (p) {
                var rurl = '.\\' + path.relative('./', p);
                console.log(rurl.cyan);
            });
            console.log('----------------------------------------------END--------------------------------------------->'.green);
            confirm('Carefully confirmed,[yes] or [no]', function (ok) {
                if (ok) { // ok is boolean
                    console.log('start upload...'.green);
                    files.forEach(function (p) {
                        var rurl = '.\\' + path.relative('./', p);
                        if(argvParse.hash){
                            getHash(rurl, function (hash) {
                                upload_run(rurl,hash);
                            });
                        }else{
                            upload_run(rurl);
                        }
                    });

                }
            });
        }
    });
}else if(argvParse.fs.length>0){
    argvParse.fs.forEach(function (file) {
        if(argvParse.hash){
            getHash(file, function (hash) {
                upload_run(file,hash);
            });
        }else{
            upload_run(file);
        }
    });
}else{
    console.log('Enter incorrect'.yellow);
}

 

END



评论
Login