nodejs 编写(添加时间戳)命令行工具 timestamp

Nodejs除了编写服务器端程序还可以编写命令行工具,如gulp.js就是Nodejs编写的。

接下来我们来实现一个添加时间戳的命令: $ timestamp action

https://www.npmjs.com/package/timestamp007

1.需要用的模块:

commander  模块

  • 用途 :解析命令行参数
  • 主页: https://tj.github.io/commander.js/

fs 模块

  • 用途 :于对系统文件及目录进行读写操作

2.命令格式

编写命令行工具前,首先定义命令的使用方式:

如:

  • 项目文件目录下 $ timestamp action  表示项目下所有页面将添加时间戳
  • 给某个页面添加时间戳 $ timestamp action /project/index.html  
  • 在非项目录下运行 需要制定项目目录 $ timestamp action /Users/river/web

3.常见的命令格式

command [options] [arguments]

含义如下:

  • command:命令名称,如:node,timestamp
  • options:--单词或者单字母,比如--help 或者 --h
  • arguments :参数 

在查看命令帮助时会出现  [],<>,|  等符号,他们的含义分别是

  • []:可选
  • <>:表示可变选项。一般是多选一。而且是必选其中一个。
  • X|Y|Z 多选一,如果加上[],则可不选。
  • -abc:多选,如果加上[], 则可不选。

如 timestamp 命令的使用方法描述如下:

 Usage: timestamp [options] [command]

-------------------------------------------------------------

接下来,我们一步步来创建我们的命令行项目:

 

1.首先 创建一个空的项目文件夹,然后再通过npm init 来初始化 package.json 文件夹:

  $ mkdir timestamp

  $ cd timestamp

  $ npm init 

 

2.初始化完毕后

  安装commander模块:

   $ npm install commander --save;

  安装 fs模块:

   $ npm install fs --save

 

3.安装完毕后

新建文件bin/timestamp;

文件代码如下:

#!/usr/bin/env node
var progarm = require('commander');
//命令版本号
progarm.version('0.0.1');
//help命令
progarm
    .command('help')
    .description('显示使用帮助')
    .action(function(){
        progarm.outputHelp();
    });


progarm
    .command('action [dir]')
    .description('加时间戳')
    .action(require('../lib/readfile'))
    .action(function(dir){
        console.log("极客出品")
    });


    //开始解析命令
    progarm.parse(process.argv)

文件的第一行:

#!/usr/bin/env node   :指定当前文件使用哪个解释器来执行。

progarm
    .command('help')
    .description('显示使用帮助')
    .action(function(){
        progarm.outputHelp();
    });
  • command("help")表示当前是什么命令
  • .description('显示使用帮助') 当前的命令
  • .action(callback);解析到当前命令执行的回调函数
  • progarm.parse(process.argv)开始解析命令

4.编写readfile.js

 在timestamp 目录下

$ mkdir lib

cd lib 

新建 readfile.js,文件内容如下:

var fs = require('fs'); //调用fs模块
module.exports = function (dir) { //传入的目录,如果没有参数,则默认为当前目录
    dir = dir || '.';
    if (dir.indexOf(".html") > 0) {
        addtimestimp(dir); //如果参数是.html文件
    } else {
        fs.readdir(dir, function (err, files) { //如果不是html文件则遍历文件夹下所有的.html文件
            if (err) {
                console.log(err)
            } else {
                files.forEach(function (index) {
                    var path = dir + "/" + index;
                    if (index.indexOf('.html') > 0) {
                        addtimestimp(path);
                    }
                })
            }
        })
    }
};

function addtimestimp(path){
    fs.readFile(path, 'utf-8', function (err, data) { //读取文件内容
        if (err) {
            console.log(err)
        } else {
            var nowtime = Date();
            var timestamp = Date.parse(nowtime); //以当前时间创建时间戳

            var newcss = ".css?t=" + timestamp;
            var testcss = /[.]{1}css(?t=[0-9]{0,})?/g;
            var newjs = ".js?t=" + timestamp;
            var testjs = /[.]{1}js(?t=[0-9]{0,})?/g;

            var newpng = ".png?t=" + timestamp;
            var testpng = /[.]{1}png(?t=[0-9]{0,})?/g;

            var newjpg = ".jpg?t=" + timestamp;
            var testjpg = /[.]{1}jpg(?t=[0-9]{0,})?/g;

            var newdata = (((data.replace(testcss, newcss)).replace(testjs, newjs)).replace(testpng, newpng)).replace(testjpg, newjpg);
            fs.writeFile(path, newdata, function (err) { //增加时间戳后写入
                if (err) {
                    console.log(err);
                } else {
                    console.log(path+"加时间戳完成")
                }
            });
        }
    })
}

5.编辑package.json

{
  "name": "timestamp007",
  "version": "0.0.6",
  "description": "add a timestamp to the html files",
  "main": "index.js",
  "scripts": {
    "test": "echo "Error: no test specified" && exit 1"
  },
  "author": "river.cao",
  "license": "ISC",
  "bin": {
    "timestamp": "./bin/timestamp"
  },
  "repository": {
  "type": "git",
  "url": "https://github.com/caojiangtao/timestamp"
  },
  "dependencies": {
    "commander": "^2.9.0",
    "fs": "0.0.2"
  }
}

可以看到 package.json 增加了 bin属性,那么bin 属性的作用是什么呢?

bin 属性用来指定当前模块需要连接的命令,在这里我们指定了 timestamp 命令是执行文件 :

./bin/timestamp

重点来了为了让这个设置生效,还需要执行以下命令来进行连接

$ sudo npm link

那么执行完毕了,我就可以验证命令行是否生效了,

接下来执行:

$ timestamp help 

如果看到如下内容:

  Usage: timestamp [options] [command]


  Commands:

    help          显示使用帮助
    action [dir]  加时间戳

  Options:

    -h, --help     output usage information
    -V, --version  output the version number

表示我们的命令行编写成功了!

大功告成了!可以开一瓶82年的雪碧庆祝下了!!!

等等,我觉的还是要发布到npm给兄弟们共享下劳动成果的,

那么怎么发布到NPM上呢?

首先你的有个NPM的账号吧

1,注册 NPM 账号

$ npm adduser   
Username:river.cao
Password:
Email:river@gmail.com

2.回到 timestamp 根目录 执行 npm publish ,如果没有错误提示那么就发布成果了,去 http://search.npmjs.org/上看一下吧,你的模块应该已经显示在”Latest Updates”一栏里了。(当然肯出会错,因为模块名称已经被占用了)

3.$ npm login  //如果已经有账号。可以用login命令重新登录npm

那么 nodejs 的命令行开发已经讲完了,可以去喝雪碧了

原文地址:https://www.cnblogs.com/yingcaiyi/p/5920905.html