Время чтения: 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 (более гибкий вариант)
- Установите пакет:
npm install commander
- Создайте файл команды (например,
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;
}
- Создайте главный 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();
- Добавьте скрипт в
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.
Добавить комментарий