命令行
@midwayjs/commander 是一个基于 Midway IoC 容器的命令行组件,底层使用 commander.js 做参数解析与 help 输出。你可以用 Midway 熟悉的依赖注入方式组织命令、选项解析与业务逻辑,并将命令拆分为多个 Class。
相关信息:
| 描述 | |
|---|---|
| 可用于标准项目 | ❌ |
| 可用于 Serverless | ❌ |
| 可用于一体化 | ❌ |
| 包含独立主框架 | ✅ |
| 包含独立日志 | ✅ |
安装依赖
在现有项目中安装 commander 组件依赖。
$ npm i @midwayjs/commander@4 --save
或者在 package.json 中增加如下依赖后,重新安装。
{
"dependencies": {
"@midwayjs/commander": "^4.0.0"
}
}
开启组件
在入口配置中引入组件。
// src/configuration.ts
import { Configuration } from '@midwayjs/core';
import * as commander from '@midwayjs/commander';
@Configuration({
imports: [commander],
})
export class MainConfiguration {}
编写命令
目录结构示例:
.
├── src
│ ├── commands
│ │ ├── hello.command.ts
│ │ └── status.command.ts
│ ├── configuration.ts
│ └── ...
├── bootstrap.js
└── package.json
一个命令对应一个 Class,使用 @Command() 修饰,并实现 CommandRunner 接口的 run() 方法。
// src/commands/hello.command.ts
import { Inject, ILogger } from '@midwayjs/core';
import { Command, CommandRunner, Option } from '@midwayjs/commander';
@Command({
name: 'hello',
description: 'hello command',
arguments: '<name>',
aliases: ['hi'],
})
export class HelloCommand implements CommandRunner {
@Inject()
logger: ILogger;
@Option({
flags: '-f, --foo [foo]',
description: 'foo option',
defaultValue: 'bar',
})
parseFoo(val: string) {
return `${val}_parsed`;
}
async run(passedParams: string[], options?: Record<string, any>) {
const [name] = passedParams;
this.logger?.info?.(`hello ${name}`, options);
}
}
@Command() 参数
name:命令名称(命令行调用与--help展示时使用)arguments:命令位置参数声明(例如<name>、<a> [b])description:命令描述,会展示在--help中argsDescription:位置参数描述对象,会展示在--help中aliases:命令别名数组