设为首页 收藏本站
查看: 964|回复: 0

[经验分享] nodejs 编写(添加时间戳)命令行工具 timestamp

[复制链接]

尚未签到

发表于 2017-2-24 10:44:00 | 显示全部楼层 |阅读模式
  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 的命令行开发已经讲完了,可以去喝雪碧了

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-346540-1-1.html 上篇帖子: Nodejs与ES6系列1:变量声明 下篇帖子: 使用nodejs防止csurf攻击的方法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表