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 的命令行开发已经讲完了,可以去喝雪碧了
nodejs 编写(添加时间戳)命令行工具 timestamp的更多相关文章
- Node.js 命令行工具的编写
日常开发中,编写 Node.js 命令行工具来完成一些小任务是很常见的操作.其编写也不难,和日常编写 Node.js 代码并无二致. package.json 中的 bin 字段 一个 npm 模块, ...
- 微软开放技术发布针对 Mac 和 Linux 的更新版 Azure Node.JS SDK 和命令行工具
发布于 2013-12-04 作者 Eduard Koller 这次为我们使用Linux 的朋友带来了更多关于部署云上虚拟机的消息.今天,微软开放技术有限公司 (MS Open Tech),想与大家分 ...
- Nodejs 如何制作命令行工具
# 全局安装,安装报错是需要前面加上sudo $ sudo npm install -g xxxb # 输出帮助 $ xxxb -h Usage: xxxb 这里是我私人玩耍的命令哦![options ...
- 如何用Node编写命令行工具
0. 命令行工具 当全局安装模块之后,我们可以在控制台下执行指定的命令来运行操作,如果npm一样.我把这样的模块称之为命令行工具模块(如理解有偏颇,欢迎指正) 1.用Node编写命令行工具 在Node ...
- 用 nodejs 写一个命令行工具 :创建 react 组件的命令行工具
用 nodejs 写一个命令行工具 :创建 react 组件的命令行工具 前言 上周,同事抱怨说 react 怎么不能像 angular 那样,使用命令行工具来生成一个组件.对呀,平时工作时,想要创建 ...
- [转]轻松学习Ionic (四) 修改应用图标及添加启动画面(更新官方命令行工具自动生成)
本文转自:http://blog.csdn.net/zapzqc/article/details/42237935 由于Ionic更新了命令行工具,以后修改应用图标和添加启动画面就简单了,最新方法见最 ...
- dedecms:织梦文章如何添加“自定义属性”标签(sql命令行工具)
dede织梦如何添加“自定义属性”标签“症状” 1.进入后台——系统——SQL命令行工具——运行SQL命令行,添加arcatt表字段: insert into`dede_arcatt`(sortid, ...
- 轻松学习Ionic (四) 修改应用图标及添加启动画面(更新官方命令行工具自动生成)
由于Ionic更新了命令行工具,以后修改应用图标和添加启动画面就简单了,最新方法见最下方: 应用图标: 1.在整个项目所在文件夹下创建res文件夹,里边再分别创建两个文件夹android和io ...
- NodeJS 安装cnpm命令行工具
在安装之前,请确保已安装Git和NodeJS. cmd机内命令窗口,输入以下命令: git config --system http.sslcainfo /bin/curl-ca-bundle.crt ...
随机推荐
- JS:window.onload的使用
1.最简单的调用方式 直接写到html的body标签里面,如: (html) (body onload="func()") (/body) (/html) 2.在JS语句调用 (s ...
- 【转】封装原生JS实现Ajax
function createXHR() { if (window.XMLHttpRequest) { //IE7+.Firefox.Opera.Chrome 和Safari return new X ...
- wpf xaml文件编辑出现中文乱码
突然有一天,发现在xaml文件编辑窗里打汉字出来了乱码...抓狂 结果发现是番茄助手搞得鬼.只能在编辑xaml文件是暂时关闭番茄助手 visual assist
- Python Pandas分组聚合
Pycharm 鼠标移动到函数上,CTRL+Q可以快速查看文档,CTR+P可以看基本的参数. apply(),applymap()和map() apply()和applymap()是DataFrame ...
- spring MVC入门教程
写一个spring mvc后台传值到前台的一个小例子. 分为以下几个步骤: 1.创建web项目. 导入项目包.具体有如下: spring-aop-4.0.4.RELEASE.jar spring-be ...
- html5定位getLocation()
HTML5 Geolocation API 用于获得用户的地理位置. 如果用户不允许定位,那么用户信息是不可用的. 获取用户的位置:getCurrentPosition() 返回数据如下 返回用户当前 ...
- Android——WebView
WebView用途 通过Intent调用系统浏览器: 引言: Uri uri = Uri.parse(url);//url为你要链接的地址 Intent intent = new Intent(Int ...
- 18. class
Class 基本用法 class n { constructor(x,y) { this.x = x; this.y = y; console.log(x,y) } proint() { consol ...
- iframe用js设定自定义高度
JS代码 function SetWinHeight(obj){ var win=obj; if (document.getElementById){ if (win && !wind ...
- react
package.json ENOSPC 文件监控增加一些 echo fs.inotify.max_user_watches=582222 | sudo tee -a /etc/sysctl.conf ...