如何发布或分发使用 mikro-orm 的应用程序?

How to release or distribute an application that uses mikro-orm?

在配置中,我必须指定定义实体的 .js 和 .ts 文件的路径:

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

所以,我什么时候去发布或分发应用程序。我还需要分发打字稿代码吗?还是我只需要分发生成的缓存?还是我需要分发两者?或者... none?

从 MikroORM v2.2 开始

现在您可以使用默认元数据提供程序,只有当您在装饰器中不提供 entitytype 选项时才会需要实体源文件(您可以使用 entity回调使用对实体 class 的引用,而不是使用 type 中的字符串名称,通过 IDE 处理重构,如 webstorm)。

原回答:

您也应该发送打字稿代码,并让缓存在服务器上重新生成 - 无论如何都会重建缓存,因为它会检查缓存实体的绝对路径是否无效。

如果您不想发布打字稿代码,您可以实现自己的缓存适配器或元数据提供程序来解决这个问题。

这是实现自定义元数据提供程序的方法,当类型选项缺失时,它只会抛出错误:

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}`)
      }
    });
  }

}

然后在初始化的时候提供这个class:

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

type 的值应该是 JS 类型,例如 string/number/Date...您可以观察缓存的元数据以确定应该包含哪些值。

另外请记住,如果没有 TS 元数据提供程序,您也需要在 @ManyToOne 装饰器中指定实体类型(通过 entity 回调,或通过 type 作为字符串)。