Skip to content

命令参数

命令参数使用 @args 装饰器定义,并作为命令类的实例属性可用。装饰器必须应用于实例属性,不接受任何参数。

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

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

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

  @args.string()
  declare name: string

  async run() {
    this.logger.info(`Hello, ${this.name}!`)
  }
}

参数类型

String

@args.string 参数接受字符串值。默认情况下,参数是必需的;您必须将参数标记为可选以接受没有值的参数。

ts
@args.string()
declare name: string

Spread

@args.spread 参数接受多个值并将它们作为字符串数组传递给命令。spread 参数必须在其他参数之后定义。

ts
@args.spread()
declare files: string[]

参数名称和描述

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

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

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

  @args.string({ argumentName: 'user-name', description: 'The name of the user' })
  declare name: string
}

可选参数

默认情况下,所有参数都是必需的。但是,您可以在装饰器选项中将参数标记为可选。

TIP

确保可选参数在必需参数之后定义。

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

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

  @args.string({ required: false })
  declare name?: string
}

定义默认值

当参数是可选的时,您可以为其定义默认值。默认值显示在帮助输出中。

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

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

  @args.string({ required: false, default: 'Guest' })
  declare name: string
}

处理参数值

您可以使用 parse 方法修改/转换参数值,然后将其设置为类属性。传递给 parse 方法的值始终是字符串。

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

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

  @args.string({
    parse(value) {
      return value ? value.toUpperCase() : value
    },
  })
  declare name: string
}

访问所有参数

您可以使用 this.parsed.args 属性访问所有参数。该属性是一个字符串数组,包含原始参数值。

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

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

  @args.string()
  declare name: string

  async run() {
    console.log(this.parsed.args)
  }
}