Команда

В NocoBase команды используются для выполнения операций, связанных с приложениями или плагинами, в командной строке: запуск системных задач, выполнение операций миграции или синхронизации, инициализация конфигурации и взаимодействие с запущенными экземплярами приложений. Разработчики могут определять собственные команды для плагинов и регистрировать их через объект app, выполняя их в интерфейсе командной строки как nocobase <command>.

Типы команд

В NocoBase регистрация команд разделена на два типа:

ТипСпособ регистрацииНужно ли включать плагинТипичные сценарии
Динамическая командаapp.command()✅ ДаБизнес-команды плагина
Статическая командаApplication.registerStaticCommand()❌ НетКоманды установки, инициализации, обслуживания

Динамические команды

Используйте app.command() для определения команд плагина. Команды можно выполнять только после включения плагина. Командные файлы должны быть помещены в src/server/commands/*.ts в каталоге плагина.

Пример

import { Application } from '@nocobase/server';

export default function (app: Application) {
  app
    .command('echo')
    .option('-v, --version')
    .action(async ([options]) => {
      console.log('Hello World!');
      if (options.version) {
        console.log('Current version:', await app.version.get());
      }
    });
}

Описание

  • app.command('echo'): определяет команду с именем echo.
  • .option('-v, --version'): добавляет опцию к команде.
  • .action(): определяет логику выполнения команд.
  • app.version.get(): получает текущую версию приложения.

Выполнение команды

nocobase echo
nocobase echo -v

Статические команды

Для регистрации используйте Application.registerStaticCommand(). Статические команды можно выполнять без включения плагинов, что подходит для задач установки, инициализации, миграции или отладки. Регистрация выполняется в методе staticImport() класса плагина.

Пример

import { Application, Plugin } from '@nocobase/server';

export default class PluginHelloServer extends Plugin {
  static staticImport() {
    Application.registerStaticCommand((app: Application) => {
      app
        .command('echo')
        .option('-v, --version')
        .action(async ([options]) => {
          console.log('Hello World!');
          if (options.version) {
            console.log('Current version:', await app.version.get());
          }
        });
    });
  }
}

Выполнение команды

nocobase echo
nocobase echo --version

Описание

  • Application.registerStaticCommand() регистрирует команды до создания экземпляра приложения.
  • Статические команды обычно используются для выполнения глобальных задач, не связанных с состоянием приложения или плагина.

API команд

Объекты команд предоставляют три дополнительных вспомогательных метода для управления контекстом выполнения:

МетодЦельПример
ipc()Взаимодействие с запущенными экземплярами приложений (через IPC)app.command('reload').ipc().action()
auth()Проверка корректности конфигурации базы данныхapp.command('seed').auth().action()
preload()Предварительная загрузка конфигурации приложения (выполните app.load())app.command('sync').preload().action()

Описание параметров

  • ipc() По умолчанию команды выполняются в новом экземпляре приложения. После включения ipc() команды взаимодействуют с запущенным в данный момент экземпляром приложения посредством межпроцессного взаимодействия (IPC). Это подходит для команд реального времени (например, обновление кэша и отправка уведомлений).

  • auth() Перед выполнением команды проверьте, доступна ли конфигурация базы данных. Если конфигурация базы данных неверна или соединение не установлено, команда не будет продолжена. Обычно используется для задач, связанных с записью или чтением базы данных.

  • preload() Предварительно загрузите конфигурацию приложения перед выполнением команды, что эквивалентно выполнению app.load(). Подходит для команд, которые зависят от конфигурации или контекста плагина.

Дополнительные методы API см. в разделе AppCommand.

Общие примеры

Инициализация данных по умолчанию

app
  .command('init-data')
  .auth()
  .preload()
  .action(async () => {
    const repo = app.db.getRepository('users');
    await repo.create({ values: { username: 'admin' } });
    console.log('Initialized default admin user.');
  });

Перезагрузка кэша для работающего экземпляра (режим IPC)

app
  .command('reload-cache')
  .ipc()
  .action(async () => {
    console.log('Requesting running app to reload cache...');
  });

Статическая регистрация команды установки

Application.registerStaticCommand((app) => {
  app
    .command('setup')
    .action(async () => {
      console.log('Setting up NocoBase environment...');
    });
});