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 的命令行开发已经讲完了,可以去喝雪碧了

nodejs 编写(添加时间戳)命令行工具 timestamp的更多相关文章

  1. Node.js 命令行工具的编写

    日常开发中,编写 Node.js 命令行工具来完成一些小任务是很常见的操作.其编写也不难,和日常编写 Node.js 代码并无二致. package.json 中的 bin 字段 一个 npm 模块, ...

  2. 微软开放技术发布针对 Mac 和 Linux 的更新版 Azure Node.JS SDK 和命令行工具

    发布于 2013-12-04 作者 Eduard Koller 这次为我们使用Linux 的朋友带来了更多关于部署云上虚拟机的消息.今天,微软开放技术有限公司 (MS Open Tech),想与大家分 ...

  3. Nodejs 如何制作命令行工具

    # 全局安装,安装报错是需要前面加上sudo $ sudo npm install -g xxxb # 输出帮助 $ xxxb -h Usage: xxxb 这里是我私人玩耍的命令哦![options ...

  4. 如何用Node编写命令行工具

    0. 命令行工具 当全局安装模块之后,我们可以在控制台下执行指定的命令来运行操作,如果npm一样.我把这样的模块称之为命令行工具模块(如理解有偏颇,欢迎指正) 1.用Node编写命令行工具 在Node ...

  5. 用 nodejs 写一个命令行工具 :创建 react 组件的命令行工具

    用 nodejs 写一个命令行工具 :创建 react 组件的命令行工具 前言 上周,同事抱怨说 react 怎么不能像 angular 那样,使用命令行工具来生成一个组件.对呀,平时工作时,想要创建 ...

  6. [转]轻松学习Ionic (四) 修改应用图标及添加启动画面(更新官方命令行工具自动生成)

    本文转自:http://blog.csdn.net/zapzqc/article/details/42237935 由于Ionic更新了命令行工具,以后修改应用图标和添加启动画面就简单了,最新方法见最 ...

  7. dedecms:织梦文章如何添加“自定义属性”标签(sql命令行工具)

    dede织梦如何添加“自定义属性”标签“症状” 1.进入后台——系统——SQL命令行工具——运行SQL命令行,添加arcatt表字段: insert into`dede_arcatt`(sortid, ...

  8. 轻松学习Ionic (四) 修改应用图标及添加启动画面(更新官方命令行工具自动生成)

    由于Ionic更新了命令行工具,以后修改应用图标和添加启动画面就简单了,最新方法见最下方:   应用图标:   1.在整个项目所在文件夹下创建res文件夹,里边再分别创建两个文件夹android和io ...

  9. NodeJS 安装cnpm命令行工具

    在安装之前,请确保已安装Git和NodeJS. cmd机内命令窗口,输入以下命令: git config --system http.sslcainfo /bin/curl-ca-bundle.crt ...

随机推荐

  1. 递推 hdu 1330

    http://www.cnblogs.com/rainydays/archive/2013/01/16/2862235.html 看样例的答案 #include<stdio.h> #inc ...

  2. windows中LNK文件打开方式恢复(每日一修(1))

    相信有些用户曾试过错误地把LNK文件的打开方式更改其他文件,导致系统所有的快捷方式都失效.在vista与Windows7系统还不普遍使用的时候,相信大家会有点惊慌失措,不要紧,下面只要大家进行如下操作 ...

  3. 微博轻量级RPC框架Motan

    Motan 是微博技术团队研发的基于 Java 的轻量级 RPC 框架,已在微博内部大规模应用多年,每天稳定支撑微博上亿次的内部调用.Motan 基于微博的高并发和高负载场景优化,成为一套简单.易用. ...

  4. JAVA面向对象

    JAVA面向对象 对象   我们生活中能看到能摸到的一切事物都是对象.在程序中模拟出生活中的所有东西万物皆对象   只要是对象--属性和行为(方法)   属性   对象有什么   例如:学生有姓名.学 ...

  5. linux 下shell中if的“-e,-d,-f”是什么意思

    文件表达式-e filename 如果 filename存在,则为真-d filename 如果 filename为目录,则为真 -f filename 如果 filename为常规文件,则为真-L ...

  6. UVA1637Double Patience(概率 + 记忆化搜索)

    训练指南P327 题意:36张牌分成9堆, 每堆4张牌.每次拿走某两堆顶部的牌,但需要点数相同.如果出现多种拿法则等概率的随机拿. 如果最后拿完所有的牌则游戏成功,求成功的概率. 开个9维数组表示每一 ...

  7. QQ远程桌面的使用

    腾讯QQ怎样使用远程桌面: ---------------------- ----------------------

  8. coreseek 安装及使用方法详解

    coreseek 安装及使用 一般站点都需要搜索功能,如果是php+mysql站点,建议选择coreseek,如果是java站点建议使用lucene,coreseek 是一款很好的中文全文检索/搜索软 ...

  9. NC凭证接口(Java发送流和处理返回结果)

    问题描述: 金融行业在系统模块分为财务和业务两个系统,我公司是负责业务模块系统,NC公司负责财务系统.但是财务有时候需要生成凭证,这时候就涉及业务模块了,我方就需要写NC凭证接口.这时候就需要三方交互 ...

  10. 【WP8.1】类似“IT之家” 自定义消息 的实现

    曾经在WP7.WP8下的消息 使用的都是Coding4Fun.Phone.Toolkit里面的ToastPrompt类来实现的. 现在我们来自己做个类似IT之家的这种效果:从右边弹出,经过几秒后会自动 ...