Typescript main.js moved under src dir?
Error: Cannot find module '/app/dist/main'
들어가며
위 포스트에서 Nest.js와 TypeORM을 연동했습니다. Railway를 사용해 실제 Production 환경에 배포해 보았습니다. 다음은 Deploy Log입니다.
$ cross-env NODE_ENV=production node dist/main
node:internal/modules/cjs/loader:988
throw err;
^
Error: Cannot find module '/app/dist/main'
at Function.Module._resolveFilename (node:internal/modules/cjs/loader:985:15)
at Function.Module._load (node:internal/modules/cjs/loader:833:27)
at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)
at node:internal/main/run_main_module:22:47 {
code: 'MODULE_NOT_FOUND',
requireStack: []
}
error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
yarn run v1.22.19
???????
문제 상황
Build까지는 문제 없이 잘 진행되었습니다. 오류를 자세히 보면 cross-env NODE_ENV=production node dist/main
에서 문제가 생겼는데, 오류 내용을 더 읽다 보면 main
스크립트를 찾을 수가 없다고 나옵니다. main
을 찾아보면 dist/src
디렉터리에 있습니다. package.json
에 정의된 start:prod
스크립트는 main
스크립트를 dist
디렉터리에서 찾고 있었습니다. 기존에는 main
파일이 dist
디렉터리에 있어서 문제가 없었는데, 뭐가 문제여서 dist/src
디렉터리로 이동했을까요?
참고
작업 당시 Production 환경에 배포되어 있던 Commit입니다.
문제가 된 Pull Request입니다. fix: locate dist main.js correctly Commit 직전까지 문제가 발생하고 있었습니다.
바뀐 거라고는 이전 포스트에서 작성한 내용들 뿐입니다. 그 중 무언가 차이가 있기 때문에 문제가 발생하는 것이겠죠?
구원자
저와 똑같은 문제를 겪고 있는 Issue를 발견했습니다. 질문 내용은 다음과 같습니다.
ormconfig 파일을 추가한 뒤로 dist 디렉터리 내 빌드 결과물이 달라집니다.
답변 내용은 다음과 같습니다.
ormconfig.ts
. If it is a js
file, the dist
structure will not change (assuming you never import the js file). This is how Typescript works to ensure the dist
directory has the same file import paths.ormconfig.ts
를 사용하고 있다면 정상적인 현상입니다. 만약 (해당 파일이) js
파일이었다면 dist
디렉터리 내 구조는 바뀌지 않았을 겁니다 (해당 파일을 어디선가 import한 적이 없다면 말이죠). dist
디렉터리가 같은 파일 import 경로를 보장하도록 하기 위해 Typescript가 사용하는 방식입니다.즉, 기존에는 프로젝트의 src
디렉터리의 하위에만 Typescript 파일을 생성해 사용하다가, ormconfig.ts
파일을 src
디렉터리 밖에 생성한 것이 문제의 원인이라는 것입니다. Typescript가 공통된 src
디렉터리를 생략하고 있었던 겁니다.
결론
문제의 원인은 Typescript 파일이 존재하는 최상위 디렉터리 위치였습니다. 해결하는 방법은 두 가지가 있는데, 문제가 된 ormconfig.ts
파일을 src
파일 안으로 옮기거나, package.json
의 start:prod
스크립트에서 main
파일을 dist/src
에서 찾도록 하는 방법이 있습니다. 저는 후자를 선택했습니다.