开发自己的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了。

相关文章
|
1月前
|
Web App开发 JavaScript 前端开发
Node.js 是一种基于 Chrome V8 引擎的后端开发技术,以其高效、灵活著称。本文将介绍 Node.js 的基础概念
Node.js 是一种基于 Chrome V8 引擎的后端开发技术,以其高效、灵活著称。本文将介绍 Node.js 的基础概念,包括事件驱动、单线程模型和模块系统;探讨其安装配置、核心模块使用、实战应用如搭建 Web 服务器、文件操作及实时通信;分析项目结构与开发流程,讨论其优势与挑战,并通过案例展示 Node.js 在实际项目中的应用,旨在帮助开发者更好地掌握这一强大工具。
46 1
|
2月前
|
JavaScript 前端开发 NoSQL
深入浅出Node.js后端开发
本文将引导你了解Node.js的基础知识,包括安装、运行环境搭建以及简单的代码示例。通过阅读本文,你将学会如何利用Node.js进行后端开发,并理解异步编程和事件驱动模型的核心概念。文章还将介绍一些实用的库和框架,帮助你快速开始Node.js项目。
80 4
|
24天前
|
Web App开发 JavaScript 前端开发
Node.js开发
Node.js开发
39 13
|
1月前
|
存储 JavaScript 前端开发
深入浅出Node.js后端开发
在数字化时代的浪潮中,后端开发作为连接用户与数据的桥梁,扮演着至关重要的角色。本文将以Node.js为例,深入探讨其背后的哲学思想、核心特性以及在实际项目中的应用,旨在为读者揭示Node.js如何优雅地处理高并发请求,并通过实践案例加深理解。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供新的视角和思考。
|
28天前
|
Web App开发 开发框架 JavaScript
深入浅出Node.js后端开发
本文将带你领略Node.js的魅力,从基础概念到实践应用,一步步深入理解并掌握Node.js在后端开发中的运用。我们将通过实例学习如何搭建一个基本的Web服务,探讨Node.js的事件驱动和非阻塞I/O模型,以及如何利用其强大的生态系统进行高效的后端开发。无论你是前端开发者还是后端新手,这篇文章都会为你打开一扇通往全栈开发的大门。
|
1月前
|
Web App开发 开发框架 JavaScript
深入浅出Node.js后端开发
在这篇文章中,我们将一起探索Node.js的奇妙世界。无论你是刚接触后端开发的新手,还是希望深化理解的老手,这篇文章都适合你。我们将从基础概念开始,逐步深入到实际应用,最后通过一个代码示例来巩固所学知识。让我们一起开启这段旅程吧!
|
27天前
|
Web App开发 JavaScript 前端开发
深入浅出Node.js后端开发
本文将带领读者从零基础开始,一步步深入到Node.js后端开发的精髓。我们将通过通俗易懂的语言和实际代码示例,探索Node.js的强大功能及其在现代Web开发中的应用。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供新的见解和技巧,让你的后端开发技能更上一层楼。
|
1月前
|
JavaScript 前端开发 API
深入理解Node.js事件循环及其在后端开发中的应用
本文旨在揭示Node.js的核心特性之一——事件循环,并探讨其对后端开发实践的深远影响。通过剖析事件循环的工作原理和关键组件,我们不仅能够更好地理解Node.js的非阻塞I/O模型,还能学会如何优化我们的后端应用以提高性能和响应能力。文章将结合实例分析事件循环在处理大量并发请求时的优势,以及如何避免常见的编程陷阱,从而为读者提供从理论到实践的全面指导。
|
1月前
|
Web App开发 JavaScript 前端开发
深入浅出Node.js后端开发
本文将带你走进Node.js的世界,从基础到进阶,逐步解析Node.js在后端开发中的应用。我们将通过实例来理解Node.js的异步特性、事件驱动模型以及如何利用它处理高并发请求。此外,文章还会介绍如何搭建一个基本的Node.js服务器,并探讨如何利用现代前端框架与Node.js进行交互,实现全栈式开发。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供新的视角和深入的理解。
27 4
|
1月前
|
Web App开发 JavaScript 前端开发
深入浅出Node.js后端开发
【10月更文挑战第40天】在这篇文章中,我们将一起探索Node.js的奥秘,从基础概念到实际应用,逐步揭示如何利用Node.js构建高效、可扩展的后端服务。通过实际案例分析,我们将了解Node.js在现代Web开发中的应用,以及如何克服常见的开发挑战。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供宝贵的见解和实用的技巧,帮助你在Node.js的道路上更进一步。
30 4