Как выпустить или распространить приложение, которое использует микро-орм? - PullRequest
1 голос
/ 04 апреля 2019

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

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

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

1 Ответ

1 голос
/ 04 апреля 2019

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

Теперь вы можете работать с провайдером метаданных по умолчанию, для него требуются исходные файлы сущностей, только если вы не предоставляете опции entity или type в своих декораторах (вы можетеиспользуйте entity callback для использования ссылки на класс сущности вместо использования имени строки в 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 callback, либо в виде строки через type).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...