pm2는 Process Manager 2 의 약자로
프로세스를 관리해주는 툴이다.
요녀석은 기본적으로 node.js 를 실행해주는데 이 글에선 .ts (타입스크립트) 기반 앱을 바로 실행시키는 법을 다뤄보겠다.
프로젝트 내에서 js와 ts 모두 사용중이고, 각각이 별도의 앱이라 굳이 하나의 형식으로 통합하기 보다는
js 는 node로
ts 는 ts-node 로 실행하고있다.
아직은 개발단계라 ts-node 사용으로 인한 성능저하는 크게 고려하지 않는다.
대신, transpileOnly: true 설정을 통해 성능저하를 최소화 해두었다.
pm2 설치
# npm, yarn 무엇을 쓰든 상관 X
$ npm install -g pm2
# 타입스크립트 지원을 위해
$ pm2 install typescript
보통은 위와 같이 pm2 를 글로벌 디렉토리 (/usr/local/lib/node_modules) 에 설치하는데 여기서 문제가 발생한다.
⚠️ 실행하니까, ts 파일이 인식이 안된다?
[PM2][ERROR] Interpreter /usr/local/lib/node_modules/pm2/node_modules/.bin/ts-node is NOT AVAILABLE in PATH. (type 'which /usr/local/lib/node_modules/pm2/node_modules/.bin/ts-node' to double check.)
'ts-node' 를 찾을 수 없다는 메시지가 출력된다.
타입스크립트 개발을 하는사람이라면 대부분 typescript, ts-node 는 global 옵션으로 설치했을 것이다.
# 여기서의 `pm2`는 글로벌 path 에 있는 pm2다.
$ pm2 start app.ts
🤔 어떻게 하라고?
global 이 아닌 현재 프로젝트 `node_modules`에 pm2 와 typescript 를 설치해야한다.
# 프로젝트 내에서
# 현재 프로젝트 내의 node_modules 에 pm2 패키지 설치
$ npm install -D pm2
$ pm2 install typescript
근데 -g 옵션으로 설치한것은 자동으로 PATH 에 등록되지만
local 에 설치한것은 그렇지 않잖아?
현재 프로젝트의 node_modules 패키지를 실행하는 방법
꼭 $PATH 를 수정하지 않아도된다.
npm@.5.2.0 버전부터는 `npx` 패키지가 local 프로젝트 내의 node_modules/.bin 파일을 실행시켜 줄 것이다.
✅ npx 를 사용하라!
npx 는 $PATH => node_modules/.bin (project binaries) 순서대로 검사한다.
만약 $PATH 에 등록되지 않았다면 (-g 옵션으로 설치한 패키지가 아닌경우)
로컬 프로젝트(node_modules/.bin) 에 자동으로 설치하고 등록해줄 것이다.
# 프로젝트 내 node_moduels/.bin 패키지를 사용해 실행시키는 방법.
$ npx [options] <command> [command-arg..]
한번 이렇게 프로젝트 내에서 실행한경우
다음번엔 `npx` 를 빼놓고 실행해도 등록된 경로에서 실행된다.
📝 결론
원하는 프로젝트 내에서 다음 명령어 2개만 실행하면 기본 셋업은 끝난다.
# 2 step 으로 pm2와 typescript 모듈 설치하기
$ npm install -D pm2
$ npx pm2 install typescript
부록별책
그러나 tsconfig.json에 path, baseUrl 등 alias path 를 사용한 경우 다음과 같은 에러가 발생할 수 있다.
"baseUrl": "./src",
"paths": {
"@modules/*": ["rest/modules/*"],
}
Error: Cannot find module '@modules/user'
🔑 간단 솔루션
1. CLI 를 사용한 방법
# ts-node 로 실행하라
# 첫 -- 는 ts-node에 인자를 주는 것과 같다.
# --teyp-check -r tsconfig-paths/rgister [대상파일명.ts]
# -P, --project [path] : Path to tsconfig.json file
$ npx pm2 start ts-node -- --project [PROJECT-PATH]/tsconfig.json app.ts --watch
# Reference
# https://typestrong.org/ts-node/docs/options/
경로가 복잡한 것이 단점이다.
왜 이런 복잡한 인자를 여러개 넘기며 실행하는가?
사실 tsc . || npm build 등을 사용하면 `dist/` 디렉토리에 트랜스파일된 .js 파일이 모여있게 할 수 있으나
이 파일들은 @lib/~~ 등 alias path 를 사용하기 어렵고 이외에 path remapper 패키지가 있긴하나 pm2 와 같이 사용하기에 까다롭다.
따라서 모든 .ts .js 파일이 의존성을 갖는 경우가 아니면
.tsconfig 의 baseUrl, paths 를 잘 명시해놓고 pm2 에 옵션을 넣어 실행시키는 것이 좋다.
이 포스팅의 범위를 넘어서기 때문에 'tsconfig-paths' 패키지에 대한 내용은 생략하겠다.
It's possible to pass args to npm run since npm 2 (2014). The syntax is as follows:
# Note the -- separator, used to separate the params passed to npm command itself,
# and the params passed to your script.
$ npm run <command> [-- <args>]
2. pm2 configuration json 활용 (추천)
# Configuration 파일에 등록된 앱 모두 실행
$ pm2 start [pm2-config-file].json
pm2 실행시 주의할 점
pm2 의 옵션은 명령어를 입력한 '현재 디렉토리' 기준으로 동작한다.
특히, --watch 옵션을 사용할 때 조심해야한다.
프로젝트 루트에서 pm2 실행 스크립트를 입력하거나
config.js 파일을 위치시키는 것이 좋다.
🔗 Reference
'기타 > 잡동사니' 카테고리의 다른 글
.csv 파일로 100만 row 만들기 (0) | 2022.08.16 |
---|---|
package.json 에서 .env 파일을 불러올 수 없을까? (0) | 2022.07.21 |
redis.conf 권장설정 (0) | 2021.12.21 |
Windows 10 Bootable USB (0) | 2021.11.05 |
YAML 파일 작성법 (0) | 2021.08.06 |