Skip to content
On this page

指令

指令除了前面说的常规用法之外,还有一些高级技巧。

元数据继承

指令在使用 OO 的方式继承其他指令的时候,也会继承其他指令的所有配置信息( 包括 OptionMiddleware ),这个跟一般 IoC 的类设计不太一致( 大部分是不会做继承元数据这么个操作的 ),指令之所以这样做,主要是因为指令的 Option 配置会比较多,如果不支持继承重复写的成本很高。

所以 artus-cli 默认开启了指令元数据继承的功能,如果不想使用元数据继承,也可以通过 inheritMetadata 配置关闭:

ts
// config/config.default.ts
export default {
  inheritMetadata: false
}

也可以只对指定的指令关闭

ts
import { DefineCommand, Command, Utils } from '@artus-cli/artus-cli';

// test command
@DefineCommand({
  command: 'test',
}, { inheritMetadata: false })
export class TestCommand extends Command {
  async run() {
    console.info('test');
  }
}

指令重定向

存在一种场景需要对指令做重定向( 即更改执行指令 ),框架提供了 Utils 类( 下文有详细介绍 ),其中具备一些实用的工具函数。

比如上面的注入指令的例子,可以直接用重定向的方式

typescript
import { DefineCommand, Command, Utils } from '@artus-cli/artus-cli';

// test command
@DefineCommand({
  command: 'test',
})
export class TestCommand extends Command {
  async run() {
    console.info('test');
  }
}

// coverage command
@DefineCommand({
  command: 'cov',
})
export class CovCommand extends Command {
  @Inject()
  utils: Utils;

  async run() {
    console.info('coverage');

    // 参数格式跟 process.argv 一致,也可以写 flags 
    return this.utils.redirect([ 'test' ]);
  }
}

指令冲突与覆盖

如果两个指令的 command 除了 arugments 之外是一样的,为了避免开发时不小心写了同样的 command 导致难以快速排查出原因,框架目前针对同样的 command 会报错提醒指令冲突。

如果开发者确认就是需要覆盖指令,可以在 DefineCommand 的参数中传入 overrideCommand 参数来强制覆盖。

typescript
import { DefineCommand, Command } from '@artus-cli/artus-cli';

// test command
@DefineCommand({
  command: 'test',
})
export class TestCommand extends Command {
  async run() {
    console.info('test');
  }
}

// new test command
@DefineCommand({
  command: 'test',
}, { overrideCommand: true }) // 标识强制覆盖
export class NewTestCommand extends Command {
  async run() {
    console.info('new test');
  }
}