当前位置:   article > 正文

Nodejs 制作命令行工具

Nodejs 制作命令行工具

wcj

   

github仓库源码下载

这不仅是一篇教程,还是通过命令行输出我自己简历的一个工具O(∩_∩)O哈哈哈~,很有趣的样子哦。

  1. # 全局安装,安装报错是需要前面加上sudo
  2. $ sudo npm install -g wcj
  3. # 输出帮助
  4. $ wcj -h
  5. Usage: wcj 这里是我私人玩耍的命令哦![options] <package>
  6. Commands:
  7. resume|rs [options] [cmd] 这里是我的简历详情!
  8. Options:
  9. -h, --help output usage information
  10. -V, --version output the version number
  11. # 输出子命令帮助
  12. $ wcj rs -h
  13. Usage: resume|rs [options] [cmd]
  14. 这里是我的简历详情!
  15. Options:
  16. -h, --help output usage information
  17. -b, --basicinfo [type] 基本信息
  18. -e, --education [type] 教育经历
  19. basicinfo 说明:
  20. preview 预览简历
  21. -b, --basicinfo 基本信息
  22. name : 名字
  23. height : 身高
  24. dateOfBirth : 出生日期
  25. workExperience : 工作经验
  26. mobile : 手机号码
  27. telephone : 电话号码
  28. email : 邮箱地址
  29. residency : 居住地点
  30. currentSituation : 现状
  31. currentCity : 当前城市
  32. nation : 国家
  33. region : 地区
  34. postalCode : 邮编地址
  35. ID : 身份证ID
  36. website : 个人网赚
  37. maritalStatus : 婚姻状况
  38. politicalStatus : 政治面貌
  39. -e, --education 教育经历

在使用 Nodejs 过程中,有很多包都支持全局安装,提供一个命令,然后在命令行我们就可以完成一些任务。有时候我们也需要开发这样的命令工具。在Node.js 中发现弄个命令行工具特别轻松,我来学习如何使用 Node.js 生成自己的command命令,在未来的项目中方便自己。

  • 先弄个小实例感受一下命令行的魅力

  • 再用命令行实现输出自己的简历(我觉得这个可能很有趣)

  • 常用的命令加入进来

    • ls 查看当前目录

    • ls -a 包括隐藏文件

    • 打开当前目录

  • 就先这么计划着吧。

小实例

开始编写之前需要确认的一件事情是你已经安装了Node.js。你可以在命令行中运行 which node 来确认是否已经安装,或者运行 node -v 查看 node 的版本 。如果你已经安装了node,你可以看到类似于下面的输出结果,一般情况安装了node.js 顺带npm工具自动安装了。

  1. $ which node
  2. /usr/local/bin/node
  3. $ node -v
  4. v0.10.36

创建目录

首先任意创建一个文件夹,初始化 package.json 文件,在该文件夹下创建bin目录:

  1. $ mkdir wcj #创建一个文件夹
  2. $ cd wcj && mkdir bin
  3. $ npm init #初始化 `package.json` 文件

编写命令行

cd到 bin 目录下,新建一个 wcj.js 文件(名字自取),编写如下代码,在js文件顶部加上 #!/usr/bin/env node 这段代码:

  1. #!/usr/bin/env node
  2. var fs = require("fs"),
  3. path = process.cwd();
  4. var run= function (obj) {
  5. if(obj[0] === '-v'){
  6. console.log('version is 1.0.0');
  7. }else if(obj[0] === '-h'){
  8. console.log('Useage:');
  9. console.log(' -v --version [show version]');
  10. }else{
  11. fs.readdir(path, function(err, files){
  12. if(err){
  13. return console.log(err);
  14. }
  15. for(var i = 0; i < files.length; i += 1){
  16. console.log(files[i]);
  17. }
  18. });
  19. }
  20. };
  21. //获取除第一个命令以后的参数,使用空格拆分
  22. run(process.argv.slice(2));

上面的 #!/usr/bin/env node 被成为 shebang ,表示用后面的路径所示的程序来执行当前文件夹。还需要一个 package.json 文件

  1. {
  2. "name": "wcj",
  3. "version": "1.0.0",
  4. "description": "wcj ---",
  5. "repository": {
  6. "type": "git",
  7. "url": "https://github.com/jaywcjlove/wcj.git"
  8. },
  9. "main": "index.js",
  10. "bin": { "wcj": "bin/wcj.js" },
  11. "author": "kenny wang <wowohoo@qq.com> ",
  12. "license": "MIT"
  13. }

运行 node bin/wcj.js 会显示当前文件夹下的所以文件和文件夹名。这个玩意儿真的跑起来了。更多npm link的信息请查看

package.json 文件中 bin 里面的内容表示这个字段将 wcj 命令映射到了你的 bin/wcj.js 脚本。bin参考

此工具采用 npm版本号采用的 semver 规则

"bin": { "wcj""bin/wcj.js" }

列子源码

全局运行命令调试

确保你在 package.json 文件中添加了 bin 节点。然后打开命令了工具进入 wcj 目录

install

如果在项目目录下运行没有问题,可以将当前目录模块安装到全局,也可以采用此方法来更新你的命令行工具

sudo npm install . -g

link

或者目录输入 npm link 会自动添加全局的 symbolic link ,然后就可以使用自己的命令了。

  1. $ wcj
  2. #README.md
  3. #bin
  4. #package.json
  5. $ cmd -v
  6. # version is 1.0.0
  7. $ cmd -h
  8. #Useage:
  9. # -v --version [show version]

错误处理

在运行 sudo npm install . -g 会有一堆警告可以忽视

如果你已经 npm link 搞了一遍你再 link 一遍,会报如下错误。即使你 npm unlink 也会报如下错误:

  1. npm link
  2. npm ERR! Darwin 14.3.0
  3. npm ERR! argv "node" "/usr/local/bin/npm" "link"
  4. npm ERR! node v0.10.36
  5. npm ERR! npm v2.7.1
  6. npm ERR! path /usr/local/bin/wcj
  7. npm ERR! code EEXIST
  8. npm ERR! Refusing to delete: /usr/local/bin/wcj not in /Applications/XAMPP/xamppfiles/htdocs/git/github.com/myJS/wcj
  9. File exists: /usr/local/bin/wcj
  10. Move it away, and try again.

让你删除 /usr/local/bin/wcj 再 npm link , 删除此目录运行 rm -rf /usr/local/bin/wcj

发布安装

发布到npm中

发布必须注册 npm 账号,还有 github 账号,具体怎么玩儿问 谷歌大婶吧。在JSLite.io 中也有教程哦。

npm publish

安装

前提你发布到了npm中,你就可以运行下面的命令了。

sudo npm install -g wcj

例子下载:v1.0.1

Commander

依赖 nodejs 原生开发命令工具比较麻烦,Commander.js 可以帮助我们简化命令行开发。Commander 是一款重量轻,表现力和强大的命令行框架。提供了用户命令行输入和参数解析强大功能。Commander 源自一个同名的Ruby项目。Commander.js 是 TJ 写的一个帮助快速开发Nodejs命令行工具的package。TJ这货是Nodejs社区里非常知名的高产作者。方便的定义option(包括option的描述和其回调函数)和子命令。

特性

Commander的方便之处在于:

自记录代码、自动生成帮助、合并短参数(“ABC”==“-A-B-C”)、默认选项、强制选项​​、命令解析、提示符

API

Option(): 初始化自定义参数对象,设置“关键字”和“描述” 
Command(): 初始化命令行参数对象,直接获得命令行输入 
Command#command(): 定义一个命令名字 
Command#action(): 注册一个callback函数 
Command#option(): 定义参数,需要设置“关键字”和“描述”,关键字包括“简写”和“全写”两部分,以”,”,”|”,”空格”做分隔。 
Command#parse(): 解析命令行参数argv 
Command#description(): 设置description值 
Command#usage(): 设置usage值

参考:官方文档例子

安装

安装commander

sudo npm install commander

Option

内置选项Built-in option,Commander 会为程序提供给一个默认的 -h option。

  1. program
  2. .version('0.0.1')
  3. .option('-r, --resume', '简历');
  4. program.parse(process.argv);

其中parse函数是处理定义的option和sub-command, 解析命令行参数并触发相应的回调(下文会说)。

  1. ./bin/wcj.js -h
  2. ## 输出下面内容
  3. Usage: wcj [options]
  4. Options:
  5. -h, --help output usage information
  6. -V, --version output the version number
  7. -r, --resume 简历

可以看到默认就有个 -h 参数,传入后会输出 wcj 命令的帮助信息。

Custom option

为 wcj 命令增加一个 option,展示说明是我的简历。

  1. program
  2. .version('0.0.1')
  3. .option('-r| --resume', '简历');
  4. program.parse(process.argv);
  5. if (program.resume) {
  6. console.log('简历 - '
  7. + '这个是我的简历!'
  8. );
  9. }

option() 接收四个参数

  • 第一个参数中,-r 为short option--resume为对应的long option, 二者的分割符是|或者,。在命令行里使用时,这两个是等价的。 区别是后者可以在程序里通过 program.resume 的方式取到该 option 的值,此处 option 的值为 bool,也可以为字符串。

  • 第二个为 option 描述, 会在 help 信息里展示出来

  • 第三个参数为回调函数

  • 第四个参数为默认值

Unknown option

当接收到未定义的option时,程序会自动抛出错误

  1. ./bin/wcj.js -h
  2. ## 输出下面内容
  3. error: unknown option '--res'

Commander同时提供了api来取消这个自动报错机制, .allowUnknownOption()

  1. #!/usr/bin/env node
  2. program
  3. .allowUnknownOption()
  4. .version('0.0.1')
  5. .option('-r, --resume', '简历');
  6. program.parse(process.argv);
  7. //省略一些细节...

Option types

Command支持以下两种类型的option: required 、 optional 和 bool

required 和 optional

在option的第一个参数里, 除了shortlong option,还可以指定option类型,分隔符也是|, 其中

  • <lang> required参数,使用时后边必须跟参数值, 否则程序会报错

  • [db] optional参数,后面可以选择是否跟参数值

  1. #!/usr/bin/env node
  2. var program = require('commander');
  3. program
  4. .allowUnknownOption()
  5. .version('0.0.1')
  6. .option('-r, --resume', '简历')
  7. .option('-l, --language <lang>', '这个语言是我擅长的语言。')
  8. .parse(process.argv);
  9. if (program.resume) {
  10. console.log('简历'
  11. + '-'
  12. + '这个是我的简历!'
  13. );
  14. }
  15. if (program.language) console.log('language: 我擅长的语言`' + program.language + '`');
  16. if (program.database) console.log('db: 我擅长的语言`' + program.database + '`');

看下效果

  1. ./bin/wcj.js -l python
  2. ## 输出
  3. language: 我擅长的语言`python`
  4. db: 我擅长的语言`MySQL`
  5. ./bin/wcj.js -l
  6. ## 输出
  7. error: option '-l, --language <lang>' argument missing

bool

选项值为布尔型, 像上面的--date, 默认是false,当使用此参数时,program.date 为true, 否则为false

booloption有个变种,当long option定义为no-*时默认值为true, 将

  1. var program = require('commander');
  2. program
  3. .option('-d, --no-date', 'don‘t display current date')
  4. .parse(process.argv);
  5. var dt = new Date();
  6. if (program.date) {
  7. console.log(dt.getFullYear()
  8. + '-'
  9. + (dt.getMonth() + 1)
  10. + '-'
  11. + dt.getDate()
  12. );
  13. }

不带-d 参数时, 参数的默认值为true

Automated --help

Commander会根据配置的option,sub-command等信息,自动生成help信息。

Custom help

可以通过监听--help事件来输出额外的帮助信息,如下面给fe命令添加了一些examples

  1. // must be before .parse() since node's emit() is immediate
  2. program.on('--help', function () {
  3. console.log(' 自定义的例子:')
  4. console.log('')
  5. console.log(' 输出命令 wcj -d')
  6. console.log(' 输出命令 wcj -l python')
  7. console.log('')
  8. })
  9. program.parse(process.argv);

效果如下:

  1. ./bin/wcj.js -h
  2. Usage: wcj [options]
  3. Options:
  4. -h, --help output usage information
  5. -d, --no-date display current time
  6. -l, --language <lang> 这个语言是我擅长的语言。
  7. -b, --database [db] 该数据库为我最擅长数据库
  8. 自定义的例子:
  9. 输出命令 wcj -d
  10. 输出命令 wcj -l python

像git风格一样的命令

列子源码

  1. #!/usr/bin/env node
  2. var program = require('commander');
  3. var appInfo = require('./../package.json');
  4. program
  5. .version(appInfo.version)
  6. .usage('这里是我私人玩耍的命令哦![options] <package>')
  7. //像git风格一样的子命令
  8. program
  9. //子命令
  10. .command('resume <cmd>')
  11. //短命令 - 简写方式
  12. .alias('rs')
  13. //说明
  14. .description('这里是我的简历详情!')
  15. //resume的子命令
  16. .option("-n, --name <mode>", "输出我的名字")
  17. //注册一个callback函数
  18. .action(function(cmd, options){
  19. var nm = typeof options.name=='string'?options.name:""
  20. console.log('resume "%s" 使用 %s 模式', cmd, nm);
  21. }).on('--help', function() {
  22. //这里输出子命令的帮助
  23. console.log(' Examples:');
  24. console.log(' 运行方法:');
  25. console.log(' $ ./bin/wcj.js resume ss -n aaaaa');
  26. console.log(' $ ./bin/wcj.js resume ss');
  27. console.log();
  28. });
  29. program.parse(process.argv);

上面实例运行输出方式

  1. $ ./bin/wcj.js resume ss -n aaaaa
  2. #输出:
  3. resume "ss" 使用 aaaaa 模式
  4. $ ./bin/wcj.js resume ss
  5. #输出:
  6. resume "aa" 使用 模式

事件监听

命名多少个命令就监听多少命令,--help 为默认监听事件。

  1. program.on('--help', function(argv,test){
  2. process.exit(1);
  3. });

yargs

命令行框架 yargs 和你的程序实现交互 yargs for github

  1. var argv = require('yargs').argv;
  2. if (argv.l == 'zh-cn') {
  3. console.log('Chinese site!');
  4. }else if(argv.l == 'en') {
  5. console.log('English website!');
  6. }

使用

  1. var argv = require('yargs').argv;
  2. if (argv.l == 'zh-cn') {
  3. console.log('Chinese site!');
  4. }else if(argv.l == 'en') {
  5. console.log('English website!');
  6. }

阅读参考

第一个小实例看了很多文章,记录一下,感觉非常简单的样子。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/399759
推荐阅读
相关标签
  

闽ICP备14008679号