EN

参数与上下文

读取运行时上下文与参数。

更新于

func 提供标准的静态命令与选项解析,但也允许用户读取命令参数对调用进行动态解析。

使用 Args 读取当前调用

@Args() 是只能用于 Command Handler 的参数。运行时在完成 Command 选择与解析后才会创建它。

你可以在应用引用这些值进行业务处理,但需要注意,这只是逃生窗口而非主要实现途径,过度的依赖动态解析 (特别是 raw 数据) 会失去类型保护与静态分析的优势。

src/commands/config.command.ts
import { Args, Command, Handler } from 'func'
import type { Args as CommandArgs } from 'func'

@Command('config')
export class ConfigCommand {
  @Handler(['profile', 'set'])
  setProfile(@Args() args: CommandArgs) {
    console.log(args.invokedPath) // ['config', 'profile', 'set']
    console.log(args.inputs) // 路径之后的位置输入
    console.log(args.options) // 根、module 与 command 的归一化选项
  }
}
字段包含内容
raw应用收到的原始 argv。
invokedPath用户实际调用的 Command 与 Handler 路径 token,保留 alias。
path选中 Command 与 Handler 的标准路径。
inputs完成 Command 与 Handler 选择后剩余的位置 token。
options包含根、owner Module 与 Command option 值的冻结长名称 map。

该对象、嵌套数组和 options 快照都被冻结。

注入运行时 Context

Context 是内置 DI 值,你可以在命令、服务以及模块中注入使用。用于读取应用的设置数据、完整的元数据、IO streams、cwd、取消 signal 与当前调用 exit code 等。

src/commands/major.command.ts
import { CommandMajor, Context, Handler } from 'func'

@CommandMajor()
export class MajorCommand {
  constructor(private readonly context: Context) {}

  @Handler({ flag: 'help', alias: 'h' })
  help() {
    this.context.commands.forEach(command => {
      console.log(command.path.join(' '))
    })
  }
}

应用需要指定进程结果时,将 context.exitCode 设置为 0 到 255 的整数。执行发生错误后,如果用户代码尚未指定,func 会默认设为 1。

Context.io 包含本次调用的 stdin、stdout 和 stderr。命令如何区分正常结果与诊断信息、以及如何测试输入输出,见 输入与输出

自定义参数注入

除了 @Args() 等内置参数,Command 也可以在构造函数中注入 Module 注册的 Provider。下面的 greeter 会由 func 自动创建并传入:

src/app.module.ts
import { Command, Handler, Injectable, Module } from 'func'

@Injectable()
class Greeter {
  message = '你好'
}

@Command('hello')
class HelloCommand {
  constructor(private readonly greeter: Greeter) {}

  @Handler()
  run() {
    console.log(this.greeter.message)
  }
}

@Module({
  commands: [HelloCommand],
  providers: [Greeter],
})
export class AppModule {}

这里只展示最基本的参数注入。请阅读模块,了解 Provider 的注册、共享、显式 token 与依赖可见性等完整依赖注入规则。