# 十二.yargs

  • yargs 模块能够解决如何处理命令行参数

# 1.可执行脚本

使用 JavaScript 语言编写一个可执行脚本

#!/usr/bin/env node
console.log('hello')
1
2

然后修改权限

chmod 755 hello
1

执行脚本

./hello
hello
1
2

如果想把路径去掉可以吧 hello 的路径加入环境变量 PATH。但是,另一种更好的做法是在当前目录下创建一个 package.json

{
  "name": "hello",
  "bin": {
    "hello": "hello"
  }
}
1
2
3
4
5
6

然后 npm link

npm link
1

在执行 hello 就不用输入路径了

hello
1

# 2.命令行参数的原始写法

命令行参数可以用系统变量process.env获取

#! /usr/bin/env node
console.log('hello',process.argv[2])
1
2
hello zbc
process.env = ['node','hello','zbc']
1
2

# 3.新建进程

脚本可以通过child_process模块新建子进程,从而执行linux命令

// #!/usr/bin/env node
let name = process.argv[2]
let { exec } = require("child_process")
let child = exec("echo hello " + name, (err, stdout, stderr) => {
  if (err) throw err
  conosle.info(stdout)
})
1
2
3
4
5
6
7
hello zbc
1

# 4.yargs

yargs 模块能够解决如何处理命令行参数

# 4.1 安装

npm install yargs --save
1

# 4.2 读取命令行参数

yargs 模块提供了 argv 对象,用来读取命令行参数

// #!/usr/bin/env node
let argv = require("yargs").argv
console.log("hello", argv.name)
1
2
3
hello --name=zbc
hello --name=zbc
1
2

process.argv

['/usr/local/bin/node','/usr/local/bin/hello4','--name=zbc']
1

argv

{
  "name": "zbc"
}
1
2
3

# 4.3 还可以指定别名

let argv = require("yargs").alias("n", "name").argv
1
hello -n zbc
hello --name zbc
1
2

# 4.4 下划线属性

argv 对象有一个下划线属性,可以获取非连词线开头的参数

let argv = require("yargs").argv
console.log("hello", argv.n)
console.log(argv._)
1
2
3
hello A -n zbc B C
hello zbc ['A','B','C']
1
2

# 4.5 命令行参数的配置

  • demand 是否必选
  • default 默认值
  • describe 提示
// #!/usr/bin/env node
let argv = require("yargs")
  .demand(["n"])
  .default({ n: "zbc" })
  .describe({ n: "你的名字" }).argv
console.log("hello", argv.n)
1
2
3
4
5
6

这个代表 n 不能省略,默认值为 zbc,并给出提示

option 方法允许将所有的配置写入配置对象

// #!/usr/bin/env node
let argv = require("yargs").option("n", {
  alias: "name",
  demand: true,
  default: "zbc",
  describe: "请输入你的名字",
  type: "string",
  boolean: true,
}).argv
console.log("hello", argv.n)
1
2
3
4
5
6
7
8
9
10

有时候,某些参数不需要,只起到开关作用。可以用 boolean 指定这些参数返回布尔值

// #!/usr/bin/env node
let argv = require("yargs").boolen(["private"]).argv
console.log("hello", argv.n)
1
2
3

参数 private 总是返回一个布尔值

hello
false
hello -private
true
hello -private zbc
true
1
2
3
4
5
6

# 4.6 帮助信息

yargs 模块提供以下方法,生成帮助信息

  • usage 用法格式
  • example 提供例子
  • help 显示帮助信息
  • epilog 出现在帮助信息的结尾
// #!/usr/bin/env node
let argv = require("argv")
  .option("n", {
    alias: "name",
    demand: true,
    default: "tom",
    describe: "你的名字",
    type: "string",
  })
  .usage("Usage:hello [options]")
  .example("hello -n zbc", "say hello to zbc")
  .alias("h", "help")
  .epilog("copyright 2018").argv
1
2
3
4
5
6
7
8
9
10
11
12
13