Как выпустить или распространить приложение, которое использует микро-орм?

В конфигурации я должен указать пути к файлам.js и.ts, определяющим сущности:

MikroORM.init({
    ...
    entitiesDirs: ["build/entities"],
    entitiesDirsTs: ["src/entities"],
});

Итак, когда я пойду выпускать или распространять приложение. Нужно ли распространять машинописный код тоже? или мне нужно будет распространять только сгенерированный кеш? или мне нужно будет раздавать оба? или... нет?

1 ответ

Решение

Начиная с MikroORM v2.2

Теперь вы можете работать с поставщиком метаданных по умолчанию, для этого требуются исходные файлы сущностей, только если вы не предоставите entity или же type варианты в ваших декораторах (вы можете использовать entity обратный вызов для использования ссылки на класс сущности вместо использования имени строки в typeобрабатывать рефакторинг через IDE, например, веб-шторм).

Оригинальный ответ:

Вы должны также отправить код машинописного текста и позволить кэшу восстановиться на сервере - кеш будет перестроен в любом случае, так как он проверяет абсолютный путь к кешированному объекту на предмет недействительности.

Вы можете реализовать свой собственный адаптер кеша или провайдер метаданных, чтобы обойти это, если вы не хотите отправлять машинописный код.

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

import { MetadataProvider, Utils } from 'mikro-orm';
import { EntityMetadata } from 'mikro-orm/dist/decorators';

export class SimpleMetadataProvider extends MetadataProvider {

  async loadEntityMetadata(meta: EntityMetadata, name: string): Promise<void> {
    // init types and column names
    Object.values(meta.properties).forEach(prop => {
      if (prop.entity) {
        prop.type = Utils.className(prop.entity());
      } else if (!prop.type) {
        throw new Error(`type is missing for ${meta.name}.${prop.name}`)
      }
    });
  }

}

Затем предоставьте этот класс при инициализации:

const orm = await MikroORM.init({
  // ...
  metadataProvider: SimpleMetadataProvider,
});

Значение type должно быть типа JS, как string/number/Date... Вы можете наблюдать ваши кэшированные метаданные, чтобы быть уверенным, какие значения должны быть там.

Также имейте в виду, что без провайдера метаданных TS вам также потребуется указать тип сущности в декораторе @ManyToOne (либо через entity обратный вызов или в виде строки через type).

Другие вопросы по тегам