利用node.js制作命令行工具方法教程(一)


Posted in Javascript onJune 22, 2017

前言

之前使用过一些全局安装的NPM包,安装完之后,可以通过其提供的命令,完成一些任务。比如Fis3,可以通过fis3 server start 开启fis的静态文件服务,通过fis3 release开启文件编译与发布;还有vue-cli,可以通过vue init webpack my-project来初始化vue+webpack的项目基础配置。最近有一个需求,需要写一个类似vue-cli的NPM包,通过命令行操作实现项目初始配置,所以就查看了相关资料,学习了一下如何使用node来生成自己的命令。

编写命令行

命令的目标:在当前目录下开启一个静态文件服务,端口号为8085

1.创建目录

构成命令的基础是需要一个命令文件web.js和package.json配置文件,执行以下命令:

$ mkdir node-commander #创建一个文件夹

$ cd node-commander && mkdir bin

$ npm init #初始化package.json文件<br>$ cd bin && touch web.js #创建命令文件

2.命令文件 

#!/usr/bin/env node

 

var express = require('express');

var path = process.cwd();

 

function run(argv) {

 if (argv[0] === '-v' || argv[0] === '--version') {

 console.log('version is 1.0.0');

 }

 else if (argv[0] === '-h' || argv[0] === '--help') {

 console.log('usage:\n');

 console.log('-v --version [show version]')

 }

 else if (argv[0] === '-s' || argv[0] === '--start') {

 var app = new express();

 app.use('/static', express.static(path));

 app.listen(8085, function () {

 console.log('server start at port 8085');

 });

 }

}

 

run(process.argv.slice(2)); 

文件的头部务必加入#!/usr/bin/env node这行代码,这里表示使用node作为脚本的解释程序,node的路径通过env来查找,可以避免node安装路径不一带来的问题。

其中process为node进程中的全局变量,process.argv为一数组,数组内存储着命令行的各个部分,argv[0]为node的安装路径,argv[1]为主模块文件路劲,剩下为子命令或参数,如下:

node ./bin/web.js a b c

# process.argv的值为[ '/usr/local/bin/node', '/PATH/web.js', 'a', 'b', 'c' ]

3.命令配置

在package.json文件中添加bin字段:

"bin": {

 "web": "./bin/web.js"

 },

bin字段的作用:当安装npm包时,npm将添加一条命令/usr/local/bin/web,web命令软连接到web.js文件。

调试命令行

(1)采用install方法

进入npm包目录下,执行全局install,根据package.json中bin的配置,为全局命令创建软连。

# sudo npm install . -g
/usr/local/bin/web -> /usr/local/lib/node_modules/cli-demo/bin/web.js

/usr/local/lib

`-- cli-demo@1.0.0
...

查看web命令

# which web 

/usr/local/bin/web

执行web命令

# web --start

server start at port 8085

(2)采用npm link方法

npm link方法创建了两个软连,命令与命令文件的软连,全局包与实际包文件的软连。

# sudo npm link

 

/usr/local/bin/web -> /usr/local/lib/node_modules/cli-demo/bin/web.js

/usr/local/lib/node_modules/cli-demo -> /Users/baidu/hwm/home/demos/node/node-commander

接下来可以按照方法(1)进行操作了。

发布命令包

通过npm publish进行发布,前提是有npm帐号。如何操作可以查看npm 官方文档。

本文是通过原生node.js来开发命令工具,而vue-cli是采用commander.js来简化命令工具开发,关于commander.js的使用方法,将在下一篇文章中介绍。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
JavaScript 节点操作 以及DOMDocument属性和方法
Dec 06 Javascript
JavaScript中的style.display属性操作
Mar 27 Javascript
JS网页图片按比例自适应缩放实现方法
Jan 15 Javascript
原生Ajax 和jQuery Ajax的区别示例分析
Dec 17 Javascript
jQuery使用contains过滤器实现精确匹配方法详解
Feb 25 Javascript
JavaScript 函数的执行过程
May 09 Javascript
jQuery实现的动态文字变化输出效果示例【附演示与demo源码下载】
Mar 24 jQuery
ionic+AngularJs实现获取验证码倒计时按钮
Apr 22 Javascript
详解如何构建Angular项目目录结构
Jul 13 Javascript
vue脚手架搭建项目的兼容性配置详解
Jul 17 Javascript
vue路由前进后退动画效果的实现代码
Dec 10 Javascript
一文带你理解vue创建一个后台管理系统流程(Vue+Element)
May 18 Vue.js
关于在vue-cli中使用微信自动登录和分享的实例
Jun 22 #Javascript
详解vue 配合vue-resource调用接口获取数据
Jun 22 #Javascript
vue使用stompjs实现mqtt消息推送通知
Jun 22 #Javascript
Angularjs在360兼容模式下取数据缓存问题的解决办法
Jun 22 #Javascript
详解用webpack2搭建angular2的项目
Jun 22 #Javascript
vue2.0实现分页组件的实例代码
Jun 22 #Javascript
纯JS实现只能输入数字的简单代码
Jun 21 #Javascript
You might like
PHP学习笔记之二 php入门知识
2011/01/12 PHP
yii框架通过控制台命令创建定时任务示例
2014/04/30 PHP
PHP中new static() 和 new self() 的区别介绍
2015/01/09 PHP
PHP中把错误日志保存在系统日志中(Windows系统)
2015/06/23 PHP
使用PHP生成二维码的方法汇总
2015/07/22 PHP
PHP+ajax实现获取新闻数据简单示例
2018/05/08 PHP
PHP折半(二分)查找算法实例分析
2018/05/12 PHP
ASP.NET jQuery 实例5 (显示CheckBoxList成员选中的内容)
2012/01/13 Javascript
jquery全选checkBox功能实现代码(取消全选功能)
2013/12/10 Javascript
javascript使用call调用微信API
2014/12/15 Javascript
jQuery元素属性操作实例(设置、获取及删除元素属性)
2016/09/08 Javascript
jQuery学习笔记之入门
2016/12/14 Javascript
作为老司机使用 React 总结的 11 个经验教训
2017/04/08 Javascript
小程序click-scroll组件设计
2019/06/18 Javascript
[04:26]2014DOTA2国际邀请赛-Newbee顺利进入胜者组决赛 独家专访战神7
2014/07/19 DOTA
[43:47]完美世界DOTA2联赛PWL S3 LBZS vs Phoenix 第一场 12.09
2020/12/11 DOTA
python实现的二叉树算法和kmp算法实例
2014/04/25 Python
python对url格式解析的方法
2015/05/13 Python
wxPython中listbox用法实例详解
2015/06/01 Python
Python while、for、生成器、列表推导等语句的执行效率测试
2015/06/03 Python
Python实现堆排序的方法详解
2016/05/03 Python
简单掌握Python的Collections模块中counter结构的用法
2016/07/07 Python
python中Pycharm 输出中文或打印中文乱码现象的解决办法
2017/06/16 Python
Python字典及字典基本操作方法详解
2018/01/30 Python
pandas 实现将重复表格去重,并重新转换为表格的方法
2018/04/18 Python
python PyQt5/Pyside2 按钮右击菜单实例代码
2019/08/17 Python
解决Tensorflow占用GPU显存问题
2020/02/03 Python
Python实现栈的方法详解【基于数组和单链表两种方法】
2020/02/22 Python
Python使用文件操作实现一个XX信息管理系统的示例
2020/07/02 Python
简述python Scrapy框架
2020/08/17 Python
python实现定时发送邮件到指定邮箱
2020/12/23 Python
amazeui 验证按钮扩展的实现
2020/08/21 HTML / CSS
毕业生个人的求职信范文
2013/12/03 职场文书
2015年体检中心工作总结
2015/05/27 职场文书
新店开业策划方案怎么书写?
2019/07/05 职场文书
Redis实现主从复制方式(Master&Slave)
2022/06/21 Redis