문제 원인
-
lerna mono repo 를 사용하여 디렉터리 구조가 아래와 같을 때 typeorm 에서
ormconfig.js
를 특정하지 못하는 문제/ packages/ my-package-a/ tsconfig.json package.json ormconfig.js src/ ... my-package-b/ tsconfig.json package.json ormconfig.js src/ ... ... tsconfig.json package.json ...
-
typeorm 은 npm 스크립트를 실행한 루트 디렉터리에서 ormconfig 를 찾는다.
해결
-
루트 패키지에
ormconfig.js
파일을 추가하고 아래 코드를 넣어 준다.module.exports = require(process.env.INIT_CWD + "/ormconfig");
해결된 이유
- typeorm 에서
createConnection
호출 시 ormconfig 를 최상위 npm package.json 이 존재하는 루트에서 찾는다.- createConnections 구현에서 ConnectionOptionsReader 호출
- ConnectionOptionsReader 구현 → 이곳에서 ormconfig 를 찾는다.
load
→ 로딩 부분에서 파일 형식에 따라 다르게 읽어온다.js, cjs, ts
형식인 경우require
로 읽어온다!! → 최상위 ormconfig.js 파일은 반드시 데이터를 담고 있지 않아도 된다. 모듈을 가져와서 다시 내보내는 동작만 수행해도 된다.
} else if (foundFileFormat === "js" || foundFileFormat === "cjs" || foundFileFormat === "ts") { const configModule = await require(configFile); if (configModule && "__esModule" in configModule && "default" in configModule) { connectionOptions = configModule.default; } else { connectionOptions = configModule; }
- 실행하려는 하위 패키지의 디렉터리는
process.env.INIT_CWD
로도 접근이 가능하다. 따라서,루트의 ormconfig 를 위처럼 추가한다면 어떤 하위 패키지를 실행하는지와 관계없이 항상 실행하려는 해당 하위 패키지의 디렉터리에 있는 ormconfig 와 동적으로 연결된다.