최근 인턴중인 회사의 코드를 처음부터 뜯어보고 있습니다. 예전엔 task와 관련된 부분들만 읽어봤는데, 회사 코드를 모두 읽어보면 내가 다음 task를 받았을 때 더 이해를 잘할 수 있을 것 같고 내 node 혹은 아키텍처 설계 능력에 대한 이해와 실력이 늘 것 같아서 시작했습니다.
그런데 생각 외로 배울 점이 정말 많아서 앞으로도 관련해서 추가적으로 공부한 내용이 있으면 포스팅할 계획입니다.
오늘의 주제는 nodemon입니다. 내가 아는 Nodemon은 nodemon 뒤에 arguments를 넘기면 코드에 변경이 있을 때마다 해당 arguments들을 재실행 해주는 dev 전용 라이브러리로 알고 있었습니다.
그런데 회사 코드의 package.json을 보니 다음과 같이 arguments를 넘겨주고 있는 걸 발견했습니다. 이제서야 내가 Nodemon에 대해 제대로 이해하지 못한 채로 사용하고 있음을 깨닫고 공식문서를 읽어보기로 했습니다.
우선 nodemon의 공식 문서 주소는 다음과 같습니다.
https://github.com/remy/nodemon#nodemon
공식문서에서 말하는 nodemon은 다음과 같습니다.
nodemon is a tool that helps develop node.js based applications by automatically restarting the node application when file changes in the directory are detected.
nodemon does not require any additional changes to your code or method of development. nodemon is a replacement wrapper for node. To use nodemon, replace the word node on the command line when executing your script.
nodemon은 node.js 기반 애플리케이션을 개발을 도와주는 도구입니다. 등록한 디렉토리 안에 있는 파일이 수정될 때마다 node 애플리케이션을 자동적으로 재시작해줍니다.
nodemon을 사용하려면 코드나 메서드를 수정할 필요는 없습니다. nodemon은 node를 대신해 실행할 뿐입니다. nodemon을 사용하려면, script를 실행할 때 커맨드라인에서 node라는 글자를 nodemon으로 수정하기만 하면 됩니다.
nodemon을 실행할 때 host와 port를 다음과 같이 간단하게 넘길 수 있습니다.
nodemon ./server.js localhost 8080
또한 inspect
옵션도 줄 수 있습니다.
nodemon --inspect ./server.js 80
앱에 package.json
이 있다면 main script(명령어)를 생략하고 nodemon만 입력할 수 있습니다. 이 경우 package.json
에서 첫번째로 main을 찾아 해당 명령을 nodemon으로 실행합니다.
혹여나 main이 생략되어 있다면, scripts.start
를 찾아 이를 nodemon으로 실행할 것입니다.
nodemon에 대한 FAQ나 issues를 확인할 수 있습니다.
증명하기 위해 간단한 실험을 해보겠습니다. 사전 준비 내용은 다음과 같습니다.
main
이 있는 상태에서 npm test
를 수행한 결과는 다음과 같습니다.
이번엔 main
을 지우고 npm test
를 수행해 보겠습니다.
테스트 내용
예상 시나리오와 같게 실행된 것을 볼 수 있습니다! :)
처음에 nodemon은 웹서버와 같은 프로세스들을 재시작하기 위해 만들어졌지만, 이제는 완전히 종료된 프로세스들도 관리합니다. 만약에 당신의 script가 완전히 종료되더라도 nodemon은 계속해서 디렉토리들과 scripts를 모니터링하고 변경사항이 있다면 재시작 해줄 것입니다.
nodemon이 동작하는 도중에 앱을 수동으로 재시작하고 싶다면 nodemon을 멈추고 재시작할 필요 없이 rs
를 입력하면 프로세스를 재시작할 것입니다.
nodemon은 local 혹은 global 설정 파일들을 지원합니다. 일반적으로 nodemon.json
으로 이름 짓거나, 현재 working directory에 위치하거나, home directory에 위치하면 됩니다. --config <file>
옵션을 사용하면 대체 local configuration 파일을 지정할 수 있습니다.
다음과 같은 방법으로 실행한다면 config 파일에 세팅된 내용을 덮어씌운 채로 실행할 것입니다.
=> config 파일이 있더라도 nodemon --watch index.json
이런 식으로 직접 지정해주면 config 파일대로 실행할 게 아니라 지정한 대로 실행한단 의미 같습니다.
config 파일은 JSON key values 형태로 커맨드라인을 받을 수 있습니다.
예시 :
{
"verbose": true,
"ignore": ["*.test.js", "fixtures/*"],
"execMap": {
"rb": "ruby",
"pde": "processing --sketch={{pwd}} --run"
}
}
위와 같은 nodemon.json 파일은 ruby 파일들과 processing 파일들을 지원하기 위해 global config일 것이고, 제가 nodemon demo.pde
를 실행하면 box 바깥에 있더라도 nodemon은 자동적으로 명시된 동작을 이해하고 실행할 것입니다.
더 많은 예시는 여기서 확인할 수 있습니다.
package configurations를 한 곳에 모아놓기 위해 package.json
을 사용할 수 있습니다. config 파일과 동일한 포맷으로 nodemonConfig
아래에 명시할 수 있습니다.
예시 :
{
"name": "nodemon",
"homepage": "http://nodemon.io",
"...": "... other standard package.json values",
"nodemonConfig": {
"ignore": ["test/*", "docs/*"],
"delay": 2500
}
}
--config
파일이나 local nodemon.json
이 있다면, package.json
의 config는 무시된다는 건 기억해야 합니다.
이 항목에 대해 더 자세히 알고 싶다면 nodemon --help config
에서 보거나, 여기서 확인하세요.
doc/requireable.md를 확인하세요.
doc/events.md를 확인하세요.
nodemon은 다른 프로그램을 실행하고 모니터링할 수도 있습니다. nodemon은 nodemon.json
이 없다면 script의 파일 확장자를 읽고 .js
확장자가 아닌 것들을 실행합니다.
nodemon --exec "python -v" ./app.py
이제 nodemon은 app.py
를 python에서 verbose 모드로 실행할 것입니다. (args를 넘기지 않을 것이라면, 따옴표를 붙이지 않아도 됩니다.) 그리고 .py
확장자가 붙은 프로그램의 변경사항을 확인할 것입니다.
nodemon.json을 사용하는 동안, 당신은 execMap
프로퍼티에 자신만의 디폴트 실행파일을 설정할 수 있습니다.
.pl
확장자에 대해 지원하고 싶다면, nodemon.json
파일은 다음과 같을 것입니다.
{
"execMap": {
"pl": "perl"
}
}
이제 다음과 같이 수행하면, nodemon은 perl
을 사용해야 함을 알 것입니다.
nodemon script.pl
일반적으로 global nodemon.json
에 자신만의 execMap
옵션을 추가하는 것을 권장합니다.
아직 진행중입니다.