Пытаюсь запустить CLI MikroORM, но безуспешно.
У меня есть монорепозиторий NX, где MikroORM
является библиотекой.
Я пробовал использовать переменные .env
и package.json
, но получал для них разные ошибки.
Использование package.json
Это package.json
{
"name":"@my-app",
"version":"1.0.0",
"license":"MIT",
"scripts":{},
"private":true,
"dependencies":{},
"devDependencies":{},
"mikro-orm":{
"useTsNode":true,
"tsConfigPath":"./libs/database/tsconfig.orm.json",
"configPaths":[
"./libs/database/src/lib/mikro-orm.config.ts",
"./dist/libs/database/src/lib/mikro-orm.config.js"
]
}
}
Это файл конфигурации MikroORM
import { ConfigService } from '@nestjs/config'
import { MikroOrmModuleOptions } from '@mikro-orm/nestjs'
import { MySqlDriver, ReflectMetadataProvider } from '@mikro-orm/mysql'
import { SeedManager } from '@mikro-orm/seeder'
import { Migrator } from '@mikro-orm/migrations'
import { SoftDeletableHandlerSubscriber } from '@my-app/core'
const mikroOrmConfig = {
user: process.env['DB_USERNAME'],
host: process.env['DB_HOST'],
password: process.env['DB_PASSWORD'],
dbName: process.env['DB_NAME'],
port: parseInt(process.env['DB_PORT'] as string),
driver: MySqlDriver,
autoLoadEntities: true,
entities: ['dist/**/entities/*.js'],
entitiesTs: ['src/**/entities/*.ts'],
metadataProvider: ReflectMetadataProvider,
extensions: [SoftDeletableHandlerSubscriber, SeedManager, Migrator],
registerRequestContext: true,
allowGlobalContext: process.env['NODE_ENV'] === 'test',
migrations: {
tableName: 'migration',
path: './migrations',
snapshot: true
},
seeder: {
path: './seeders',
pathTs: './seeders',
defaultSeeder: 'DatabaseSeeder',
glob: '!(*.d).{js,ts}',
emit: 'ts',
fileName: (className: string) => className
}
} as MikroOrmModuleOptions
export default mikroOrmConfig
И это tsconfig.orm.json
{
"extends": "./tsconfig.json",
"compilerOptions": {
"moduleResolution": "NodeNext"
}
}
Это tsconfig.json
, который используется для продления
{
"extends": "../../tsconfig.base.json",
"compilerOptions": {
"module": "commonjs",
"forceConsistentCasingInFileNames": true,
"strict": true,
"noImplicitOverride": true,
"noPropertyAccessFromIndexSignature": true,
"noImplicitReturns": true,
"noFallthroughCasesInSwitch": true
},
"files": [],
"include": [],
"references": [
{
"path": "./tsconfig.lib.json"
},
{
"path": "./tsconfig.spec.json"
}
]
}
При запуске npx mikro-orm debug
я получаю следующий результат
Current MikroORM CLI configuration
- dependencies:
- mikro-orm 6.2.9
- node 18.17.0
- typescript 5.3.3
- package.json found
- ts-node enabled
- searched config paths:
- C:/Work/my-company/my-app/code/my-app-backend/libs/database/src/lib/mikro-orm.config.ts (found)
- C:/Work/my-company/my-app/code/my-app-backend/dist/libs/database/src/lib/mikro-orm.config.js (found)
- C:/Work/my-company/my-app/code/my-app-backend/src/mikro-orm.config.ts (not found)
- C:/Work/my-company/my-app/code/my-app-backend/mikro-orm.config.ts (not found)
- C:/Work/my-company/my-app/code/my-app-backend/dist/mikro-orm.config.js (not found)
- C:/Work/my-company/my-app/code/my-app-backend/mikro-orm.config.js (not found)
- configuration not found (No database specified, please fill in `dbName` or `clientUrl` option)
Использование переменных .env
Это мои переменные .env
# MIKRO ORM
MIKRO_ORM_CLI_USE_TS_NODE=true
MIKRO_ORM_CLI_ALWAYS_ALLOW_TS=true
MIKRO_ORM_CLI_CONFIG = "./libs/database/src/lib/mikro-orm.config.ts"
MIKRO_ORM_CLI_TS_CONFIG_PATH = "./libs/database/tsconfig.json"
и это результат, который я получаю при запуске той же команды
Current MikroORM CLI configuration
- dependencies:
- mikro-orm 6.2.9
- node 18.17.0
- typescript 5.3.3
- package.json found
- ts-node enabled
- searched config paths:
- C:/Work/my-company/my-app/code/my-app-backend/libs/database/src/lib/mikro-orm.config.ts (found)
- C:/Work/my-company/my-app/code/my-app-backend/src/mikro-orm.config.ts (not found)
- C:/Work/my-company/my-app/code/my-app-backend/mikro-orm.config.ts (not found)
- C:/Work/my-company/my-app/code/my-app-backend/dist/mikro-orm.config.js (not found)
- C:/Work/my-company/my-app/code/my-app-backend/mikro-orm.config.js (not found)
- configuration not found (Cannot use import statement outside a module)
Переменная среды существует, и приложение работает/собирается нормально.
При выполнении только подхода переменных ENV
MIKRO_ORM_CLI_USE_TS_NODE=true
MIKRO_ORM_CLI_CONFIG = "./libs/database/src/lib/mikro-orm.config.ts"
MIKRO_ORM_CLI_TS_CONFIG_PATH = "./libs/database/tsconfig.json"
Как вы сказали, мне не нужен tsconfig.orm.json
, поэтому я использую tsconfig
, который использовал для расширения tsconfig.orm.ts
, и удалил раздел MikroORM
из package.json
. Я получаю следующую ошибку:
Current MikroORM CLI configuration
- dependencies:
- mikro-orm 6.2.9
- node 18.17.0
- typescript 5.3.3
- package.json found
- ts-node enabled
- searched config paths:
- C:/Work/my-company/my-app/code/my-app-backend/dist/mikro-orm.config.js (not found)
- C:/Work/my-company/my-app/code/my-app-backend/mikro-orm.config.js (not found)
- configuration not found (MikroORM config file not found in ['./dist/mikro-orm.config.js', './mikro-orm.config.js'])
"ts-node": "^10.9.1"
С помощью package.json
, полностью закомментировав переменные env, сохраняя при этом ссылку на ./libs/database/tsconfig.orm.json
и после добавления import 'dotenv/config'
, я теперь запускаю их. Но если я изменю tsConfigPath
на ранее упомянутый tsconfig.json
, я получу следующую ошибку:
Current MikroORM CLI configuration
- dependencies:
- mikro-orm 6.2.9
- node 18.17.0
- typescript 5.3.3
- package.json found
- ts-node enabled
- searched config paths:
- C:/Work/my-company/my-app/code/my-app-backend/libs/database/src/lib/mikro-orm.config.ts (found)
- C:/Work/my-company/my-app/code/my-app-backend/dist/libs/database/src/lib/mikro-orm.config.js (found)
- C:/Work/my-company/my-app/code/my-app-backend/src/mikro-orm.config.ts (not found)
- C:/Work/my-company/my-app/code/my-app-backend/mikro-orm.config.ts (not found)
- C:/Work/my-company/my-app/code/my-app-backend/dist/mikro-orm.config.js (not found)
- C:/Work/my-company/my-app/code/my-app-backend/mikro-orm.config.js (not found)
- configuration not found (⨯ Unable to compile TypeScript:
error TS5109: Option 'moduleResolution' must be set to '
NodeNext' (or left unspecified) when option 'module' is set to 'NodeNext'.
)
Несколько случайных заметок. Если вам нужна дополнительная помощь, свяжитесь с нами в Discord и предоставьте полный репозиторий, а не только фрагменты.
Не хотите MIKRO_ORM_CLI_ALWAYS_ALLOW_TS
, значит, вам нужно самому принести поддержку ТС, например. выполнив через bun -b
(у которого есть свои подводные камни, поскольку Bun на самом деле далек от совместимости с узлами).
Вам необходимо установить ts-node
, если вы хотите, чтобы ORM использовал его, я не вижу его в ваших зависимостях. Вероятно, это причина, по которой вы видите Cannot use import statement outside a module
, поскольку это означает, что вы пытаетесь прочитать файл TS без регистрации ts-node
.
Вам не нужен файл tsconfig.orm.json
, ORM автоматически переопределит moduleResolution
на NodeNext
на самом деле с целью регистрации поддержки TS. Также во втором подходе вы переопределяете путь к нему через env var, который указывает на что-то другое, поэтому фактически он там полностью игнорируется.
Когда вы получаете MIKRO_ORM_CLI_TS_CONFIG_PATH
dbNameNo database specified, please fill in
clientUrlor
, это, скорее всего, означает, что ваши переменные окружения пусты. Я предполагаю, что вы забыли вызвать option
в своей конфигурации - ORM больше не будет делать это за вас, начиная с версии 6, он все равно будет читать его автоматически, но будет уважать только свои собственные переменные окружения (с префиксом import 'dotenv/config'
) и не будет делать они вообще часть MIKRO_ORM_
.
Пожалуйста, попробуйте последнюю версию для разработчиков, CLI теперь устанавливает как module
, так и moduleResolution
(что, я думаю, уже было в версии 6.2.9, но, возможно, это было добавлено позже).
Спасибо за ответ. Пожалуйста, проверьте редактирование. Я могу сделать репо с NX, но, думаю, оно будет большим.