Skip to content

命令标志

命令标志使用 @flags 装饰器定义,并作为命令类的实例属性可用。装饰器必须应用于实例属性。

您可以运行 node ace <command-name> --help 命令来查看接受的标志列表及其描述。

ts
import { BaseCommand, flags } from '@adonisjs/core/ace'

export default class GreetCommand extends BaseCommand {
  static commandName = 'greet'
  static description = 'Greet a user by name'

  @flags.boolean()
  declare greeting: boolean

  async run() {
    this.logger.info(`Greet with formal greeting?: ${this.greeting}`)
  }
}

标志类型

Boolean

@flags.boolean 标志不接受值。定义标志使其生效(设置为 true)。但是,您可以将值设为 false 通过使用 --no- 前缀。例如:

sh
# greeting = true
node ace greet --greeting

# greeting = false
node ace greet --no-greeting
ts
@flags.boolean()
declare greeting: boolean

String

@flags.string 标志接受字符串值。

sh
# format = json
node ace greet --format=json

# format = json
node ace greet --format json
ts
@flags.string()
declare format: string

Number

@flags.number 标志接受数值。

sh
# limit = 10
node ace greet --limit=10

# limit = 10
node ace greet --limit 10
ts
@flags.number()
declare limit: number

Array

@flags.array 标志接受多个值。

sh
# files = ['file1.txt', 'file2.txt']
node ace greet --files=file1.txt --files=file2.txt

# files = ['file1.txt', 'file2.txt']
node ace greet --files file1.txt --files file2.txt
ts
@flags.array()
declare files: string[]

标志名称和描述

标志名称从类属性名称推断。但是,如果需要,您可以在装饰器选项中定义自定义名称和描述。

ts
import { BaseCommand, flags } from '@adonisjs/core/ace'

export default class GreetCommand extends BaseCommand {
  static commandName = 'greet'
  static description = 'Greet a user by name'

  @flags.string({ flagName: 'output-format', description: 'The output format for the command' })
  declare format: string
}

标志别名

标志可以有别名。别名必须是单字符字符串,使用单个连字符定义。

ts
import { BaseCommand, flags } from '@adonisjs/core/ace'

export default class GreetCommand extends BaseCommand {
  static commandName = 'greet'
  static description = 'Greet a user by name'

  @flags.string({ alias: 'f' })
  declare format: string
}
sh
# format = json
node ace greet -f=json
node ace greet -f json

定义默认值

您可以使用装饰器选项为标志定义默认值。默认值显示在帮助输出中。

ts
import { BaseCommand, flags } from '@adonisjs/core/ace'

export default class GreetCommand extends BaseCommand {
  static commandName = 'greet'
  static description = 'Greet a user by name'

  @flags.string({ default: 'json' })
  declare format: string
}

处理标志值

您可以使用 parse 方法在设置为类属性之前修改/转换标志值。传递给 parse 方法的值始终是字符串。

ts
import { BaseCommand, flags } from '@adonisjs/core/ace'

export default class GreetCommand extends BaseCommand {
  static commandName = 'greet'

  @flags.string({
    parse(value) {
      return value ? value.toLowerCase() : value
    },
  })
  declare format: string
}

访问所有标志

您可以使用 this.parsed.flags 属性访问所有标志。该属性是一个对象,包含标志名称(键)及其值(值)。

此外,您可以使用 this.parsed.unknownFlags 对象访问用户传递但命令未定义的未知标志。

ts
import { BaseCommand, flags } from '@adonisjs/core/ace'

export default class GreetCommand extends BaseCommand {
  static commandName = 'greet'

  @flags.string()
  declare format: string

  async run() {
    console.log(this.parsed.flags)
    console.log(this.parsed.unknownFlags)
  }
}