Создание консольной команды в NestJS

от автора

в
Время чтения: 2 мин.

В NestJS можно создавать консольные команды (CLI-команды) несколькими способами. Вот основные подходы:

1. Использование встроенного CommandRunner (NestJS 8+)

import { Command, CommandRunner, Option } from 'nest-commander';

@Command({ name: 'my-command', description: 'Моя кастомная команда' })
export class MyCommand extends CommandRunner {
  async run(
    passedParams: string[],
    options?: Record<string, any>,
  ): Promise<void> {
    console.log('Выполняется моя команда!');
    console.log('Параметры:', passedParams);
    console.log('Опции:', options);
  }

  @Option({
    flags: '-o, --option [value]',
    description: 'Кастомная опция',
  })
  parseOption(val: string) {
    return val;
  }
}

Затем добавьте команду в модуль:

@Module({
  providers: [MyCommand],
})
export class AppModule {}

2. Использование Commander.js (более гибкий вариант)

  1. Установите пакет:
npm install commander
  1. Создайте файл команды (например, src/commands/my-command.ts):
import { Command } from 'commander';
import { NestFactory } from '@nestjs/core';
import { AppModule } from '../app.module';
import { MyService } from '../my.service';

export async function registerMyCommand(program: Command) {
  const command = program.command('my-command')
    .description('Выполняет мою кастомную команду')
    .option('-o, --option <value>', 'Кастомная опция')
    .action(async (options) => {
      const app = await NestFactory.createApplicationContext(AppModule);
      const myService = app.get(MyService);

      try {
        await myService.doSomething(options);
        console.log('Команда выполнена успешно!');
      } catch (error) {
        console.error('Ошибка:', error.message);
        process.exit(1);
      } finally {
        await app.close();
      }
    });

  return command;
}
  1. Создайте главный CLI-файл (например, src/cli.ts):
#!/usr/bin/env node
import { Command } from 'commander';
import { registerMyCommand } from './commands/my-command';

async function bootstrap() {
  const program = new Command();

  program
    .name('my-app')
    .version('1.0.0')
    .description('NestJS CLI инструменты');

  // Регистрация команд
  registerMyCommand(program);

  await program.parseAsync(process.argv);
}

bootstrap();
  1. Добавьте скрипт в package.json:
{
  "scripts": {
    "cli": "ts-node src/cli.ts"
  },
  "bin": {
    "my-app": "dist/cli.js"
  }
}

3. Использование NestJS CLI плагинов

Вы также можете создать собственный плагин для NestJS CLI, но это более сложный вариант, подходящий для интеграции с существующим NestJS CLI.

Запуск команд

После настройки команды можно запускать:

# Для первого способа
npm run start:prod my-command -- параметры

# Для второго способа
npm run cli my-command -- --option значение

Или, если вы настроили bin в package.json и скомпилировали код:

my-app my-command --option значение

Выбор метода зависит от сложности ваших требований к CLI. Для простых команд достаточно первого метода, для сложных CLI с множеством команд лучше подойдет второй подход с Commander.js.


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Сколько будет 6 + 4?