如何创建一个NodeJs命令行交互项目?

来源:http://www.chinese-glasses.com 作者:Web前端 人气:76 发布时间:2020-04-15
摘要:时间: 2019-10-07阅读: 101标签: 项目 前言 使用命令行程序对程序员来说很常见,就算是前端工程师或者开发gui的,也需要使用命令行来编译程序或者打包程序 熟练使用命令行工具能极大的

时间: 2019-10-07阅读: 101标签: 项目

前言

使用命令行程序对程序员来说很常见,就算是前端工程师或者开发gui的,也需要使用命令行来编译程序或者打包程序

熟练使用命令行工具能极大的提高开发效率,linux自带的命令行工具都非常的有用,但是这些工具都是按照通用需求开发出来的
,如果有一些特别的需求,还是需要自己写脚本来完成一些比如文件批量重命名,文件内容批量替换等任务来提供工作效率。

在node.js出来之前,python经常被用来开发一些脚本完成特殊的任务,比如python爬虫,python相关的教程有很多,有兴趣的自己google。

得益于node.js的异步io特性,使用node开发io密集类任务变得非常简单,这篇文章就为大家讲讲怎么使用node.js的yargs模块来开发自己的命令行工具集合。

方法一:通过原生的NodeJs API,方法如下:

命令行参数解析

yargs是一个npm模块用来完成命令行参数解析的,回到使用shell开发命令行的时代,getopts是第一代命令行参数解析工具,经过shell => python => node.js
的迭代,命令行参数解析程序其实没有多大的进化,它们的目的始终是把用户从命令行传入的参数解析成指定的格式,供程序使用

虽然没有多大变化,但是由于开发一个命令行参数解析模块比较简单,所以目前node社区存在很多类似yargs的开源项目,这里简单列举一下,有兴趣的可以自己去了解一下,
然后选择自己喜欢的项目来使用。

#!/usr/bin/env node# test.jsvar argv = process.argv;console.log(argv)

yargs

读过阮一峰的Node.js 命令行程序开发教程之后开始使用yargs开发自己命令行工具,
用过一段时间发现非常的好用。

自阮大神的文章发布以来,yargs有了一些改动,添加有很多有用的功能,特别是.commandDir(directory, [opts])这个功能,对打造命令行工具集合非常有用,所以写一个新版本的yargs教程还是有必要的。

yargs的用法还算比较简单,对英文有自信的可以去首页阅读原版:yargs

通过以下命令执行:

简单模式

yargs默认使用两个--作为参数的前缀,中间使用空格或者=都可以

下面的代码展示了yargs最简单的用法,你只需要引入yargs,就能读取命令行参数,不需要写任何的配置,非常的简单

#!/usr/bin/env node
var argv = require('yargs').argv;

if (argv.ships > 3 && argv.distance < 53.5) {
    console.log('Plunder more riffiwobbles!');
} else {
    console.log('Retreat from the xupptumblers!');
}

$ ./plunder.js --ships=4 --distance=22
Plunder more riffiwobbles!

$ ./plunder.js --ships 12 --distance 98.7
Retreat from the xupptumblers!

示例代码都来自官网:yargs

简单模式还能读取短变量如-x 4相当于argv.x = 4

简单模式还能读取布尔类型-s相当于argv.s = true

简单模式还能读取非-开始的变量,这种类型的变量保存在argv._数组里面

node test.js param1 --param2 -param3

参数配置

简单模式的功能都只用一行代码就能实现

var argv = require('yargs').argv;

但是如果你想统计变量出现的次数怎么办? 答案就是添加参数配置选项。

#!/usr/bin/env node
var argv = require('yargs')
    .count('verbose')
    .alias('v', 'verbose')
    .argv;

VERBOSE_LEVEL = argv.verbose;

function WARN()  { VERBOSE_LEVEL >= 0 && console.log.apply(console, arguments); }
function INFO()  { VERBOSE_LEVEL >= 1 && console.log.apply(console, arguments); }
function DEBUG() { VERBOSE_LEVEL >= 2 && console.log.apply(console, arguments); }

WARN("Showing only important stuff");
INFO("Showing semi-important stuff too");
DEBUG("Extra chatty mode");

上面的程序能统计verbose参数出现的次数,缩写-v也会统计进去,具体调用例子参考下面的代码

$ node count.js
Showing only important stuff

$ node count.js -v
Showing only important stuff
Showing semi-important stuff too

$ node count.js -vv
Showing only important stuff
Showing semi-important stuff too
Extra chatty mode

$ node count.js -v --verbose
Showing only important stuff
Showing semi-important stuff too
Extra chatty mode

yargs提供很多接口用来帮助完善命令行程序,

结果输出如下:

提示用法

var argv = require('yargs')
    .usage('Usage: $0 -w [num] -h [num]')
    .argv;
[ '/usr/local/Cellar/node/10.10.0/bin/node', 'test.js', 'param1', '--param2', '-param3' ]

必选参数

#!/usr/bin/env node
var argv = require('yargs')
    .usage('Usage: $0 -w [num] -h [num]')
    .demand(['w','h'])
    .argv;

可见,argv中第一个参数为node应用程序的路径,第二个参数为被执行的js程序文件,其余为执行参数。

提供参数默认值

#!/usr/bin/env node
var argv = require('yargs')
    .default('x', 10)
    .default('y', 10)
    .argv
;
console.log(argv.x + argv.y);

方法二:通过yargs获取命令行参数,方法如下: 首先,需要在项目中引入该模块: npm install --save args 然后,创建JS可执行程序,如下:

打印帮助信息

#!/usr/bin/env node
var argv = require('yargs')
    .usage('Usage: $0 <command> [options]')
    .help('h')
    .alias('h', 'help')
    .epilog('copyright 2015')
    .argv;
#!/usr/bin/env nodevar args = require('yargs');const argv = args.option('n', {alias : 'name',demand: true,default: 'tom',describe: 'your name',type: 'string'}).usage('Usage: hello [options]').example('hello -n bob', 'say hello to Bob').help('h').alias('h', 'help').argv;console.log('the args:', argv)

使用别名

var argv = require('yargs')
    .usage('Usage: $0 <command> [options]')
    .alias('h', 'help')
    .argv;

访问argv.h相当于访问argv.help

执行如下命令:

参数数组

var argv = require('yargs')
    .usage('Usage: $0 <command> [options]')
    .alias('n', 'name')
    .array('n')
    .argv;

console.log(argv.n);

调用

node array_test.js -n abc test
node test.js -h

设置参数范围

var argv = require('yargs')
  .alias('i', 'ingredient')
  .describe('i', 'choose your sandwich ingredients')
  .choices('i', ['peanut-butter', 'jelly', 'banana', 'pickles'])
  .help('help')
  .argv

上述代码设定argv.i的值只能是['peanut-butter', 'jelly', 'banana', 'pickles']数组中的一个

上面是yargs比较简单的用法,如果想阅读完整版,建议去github上阅读

显示结果如下: Usage: hello [options]

子命令

yargs适合开发复杂的命令行程序的另一个原因是它支持子命令,而且子命令可以嵌套,这意味着你也可以开发出类似git这样拥有上百个命令的程序

yargs的子命令有两种模式:.command(*).commandDir(directory, [opts])

选项: --version 显示版本号 [布尔] -n, --name your name [字符串] [必需] [默认值: "tom"] -h, --help 显示帮助信息 [布尔]

.command

.command方法有三个接口

.command(cmd, desc, [builder], [handler])

.command(cmd, desc, [module])

.command(module)

其实它们的用法都差不多,可以把它们都看作传递一个module给yargs,这个module必须导出四个变量
cmd, desc [builder], [handler],其中builder和handler是方法,另外两个是字符串

使用第一个接口的示例

yargs
  .command(
    'get',
    'make a get HTTP request',
    function (yargs) {
      return yargs.option('u', {
        alias: 'url',
        describe: 'the URL to make an HTTP request to'
      })
    },
    function (argv) {
      console.log(argv.url)
    }
  )
  .help()
  .argv

使用第三个接口需要把这个模块在单独的文件,然后用require引入

这是模块的代码

// my-module.js
exports.command = 'get <source> [proxy]'

exports.describe = 'make a get HTTP request'

exports.builder = {
  banana: {
    default: 'cool'
  },
  batman: {
    default: 'sad'
  }
}

exports.handler = function (argv) {
  // do something with argv.
}

引入的时候这样使用

yargs.command(require('my-module'))
  .help()
  .argv

当额外的模块没有定义cmd和desc的时候可以使用第二个接口

yargs.command('get <source> [proxy]', 'make a get HTTP request', require('my-module'))
  .help()
  .argv

这里建议使用第三个接口,这样能保持模块的内聚,这种模块你能挂载在任何命令下面,迁移的时候不需要修改模块代码,只需要修改引入模块的代码就能实现

本文由10bet发布于Web前端,转载请注明出处:如何创建一个NodeJs命令行交互项目?

关键词:

上一篇:Docker部署ngnix静态网站10bet

下一篇:没有了

最火资讯