开发自己的nodejs命令行工具

简介: 在日常开发中,经常会频繁的做一些重复性的操作,作为一名程序员,解放双手的时刻到了
需求来源于生活。

在日常开发中,经常会频繁的做一些重复性的操作,作为一名程序员,解放双手的时刻到了。

比如说:批量修改某些文件的后缀,我对于一些shell或者win下的命令不是很熟悉,稍微了解的就是自己的开发语言,所以用熟悉的工具做事还是可以带来一些成就感的。

下面我准备针对这个小小的需求开发一个自己的命令行,当然如果能帮助到其他人,那就更加的满足了。闲话不多说,下面直接开始。

需求整理
  1. 可以对某个文件夹下的所有文件进行后缀的修改
  2. 可以限定某类后缀修改为指定的后缀
  3. 可以指定目标文件夹
  4. 同时可以随机重命名
准备

nodejs的环境
编辑工具sublime
npm 的帐号
github的帐号

大体流程
  1. 在github上创建自己想要的仓库changeext(命名)

2.将仓库clone到本地进行开发、测试
3.发布到github
4.发布到npm

  1. 安装到本地进行使用大功告成
步骤分解

一些帐号注册、仓库创建就不在说了,主要说下开发的具体流程
先来一段伪代码:

1.确定目标文件夹、一些相关的参数(是否重命名、源后缀、目标后缀)
2.获得目标文件夹下的所有文件(符合源后缀)
3.对符合条件的文件进行重命名(修改后缀)
4.结束,对,流程很简单,实现起来也不麻烦,但是起码这是自己的小工具啊,哪怕网上再多也是别人的

开发中使用的module:
minimist(命令行参数处理) 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'
});
//获得命令行的参数
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){//不需要循环,但是目标路径为文件夹
          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,测试成功,然后把代码发布到github(此处流程可以google),然后将自己的代码发布到npm官网(此处可以查看:https://www.jianshu.com/p/e388af61f5dd

然后,我们就可以开心的下载自己的工具来666了。

相关文章
|
3月前
|
负载均衡 监控 JavaScript
pm2 工具在 Node.js 开发和部署中的重要作用
pm2 工具在 Node.js 开发和部署中的重要作用
48 0
|
25天前
|
Web App开发 JavaScript 前端开发
js开发:请解释什么是Node.js,以及它的应用场景。
Node.js是基于V8的JavaScript运行时,用于服务器端编程。它的事件驱动、非阻塞I/O模型使其在高并发实时应用中表现出色,如Web服务器、实时聊天、API服务、微服务、工具和跨平台桌面应用(使用Electron)。适用于高性能和实时需求场景。
18 4
|
1月前
|
Web App开发 JavaScript 前端开发
深入浅出:Node.js 在后端开发中的应用与实践
【2月更文挑战第13天】本文旨在探讨Node.js这一流行的后端技术如何在现代Web开发中被应用以及它背后的核心优势。通过深入分析Node.js的非阻塞I/O模型、事件驱动机制和单线程特性,我们将揭示其在处理高并发场景下的高效性能。同时,结合实际开发案例,本文将展示如何利用Node.js构建高性能、可扩展的后端服务,以及在实际项目中遇到的挑战和解决方案。此外,我们还将讨论Node.js生态系统中的重要工具和库,如Express.js、Koa.js等,它们如何帮助开发者快速搭建和部署应用。通过本文的探讨,读者将获得对Node.js在后端开发中应用的深入理解,以及如何有效利用这一技术来提升开发效率
|
2月前
|
JavaScript iOS开发 MacOS
掌握NVM、NRM和NPM:Node.js开发的利器
掌握NVM、NRM和NPM:Node.js开发的利器
66 0
|
2月前
|
资源调度 JavaScript 开发工具
从npm慢如蜗牛到飞驰如光:nrm加速你的Node.js开发
从npm慢如蜗牛到飞驰如光:nrm加速你的Node.js开发
111 0
|
3月前
|
小程序
微信小程序|Springboot+Vue+Node开发实现医疗预约挂号系统(二)
微信小程序|Springboot+Vue+Node开发实现医疗预约挂号系统
|
3月前
|
小程序 前端开发 Java
微信小程序|Springboot+Vue+Node开发实现医疗预约挂号系统(一)
微信小程序|Springboot+Vue+Node开发实现医疗预约挂号系统
|
4月前
|
JavaScript 前端开发 关系型数据库
基于Nodejs+vue开发实现酒店管理系统
基于Nodejs+vue开发实现酒店管理系统
|
4月前
|
JavaScript 前端开发 应用服务中间件
基于Nodejs+vue开发实现高校学院网站系统
基于Nodejs+vue开发实现高校学院网站系统
|
4月前
|
前端开发 小程序 Java
基于Node+Vue+Express开发实现商城系统
基于Node+Vue+Express开发实现商城系统