Nodemon: Nodemon์€ ์ž์ฃผ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹คํ–‰(๋ถ„๋ฆฌ) ์ƒํƒœ๋กœ ๋‘ก๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2017๋…„ 05์›” 10์ผ  ยท  100์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: remy/nodemon

๊ฐœ๋ฐœ ์ค‘์ธ Express ์„œ๋ฒ„๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜๊ธฐ ์œ„ํ•ด Nodemon์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ ์‹œ server.close() ์ •๋ฆฌ๋„ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์‹œ์ž‘ํ•  ๋•Œ "ํฌํŠธ 3000์ด ์ด๋ฏธ ์‚ฌ์šฉ ์ค‘์ž…๋‹ˆ๋‹ค"๋ผ๋Š” ๋ฉ”์‹œ์ง€๊ฐ€ ์ž์ฃผ ํ‘œ์‹œ๋˜์–ด nodemon์ด ์ด์ „ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ข…๋ฃŒํ•˜์ง€ ๋ชปํ–ˆ๊ณ  ์—ฌ์ „ํžˆ ๋ถ„๋ฆฌ๋œ ํ”„๋กœ์„ธ์Šค๋กœ ์‹คํ–‰ ์ค‘์ž„์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. nodemon์„ ์ฃฝ์ด๊ณ  killall node ์‹คํ–‰ํ•˜๊ณ  nodemon์„ ๋‹ค์‹œ ์‹œ์ž‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์•Œ๋ ค์ง„ ๋ฌธ์ œ์ž…๋‹ˆ๊นŒ? ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

  • OS X ์—˜ ์บํ”ผํƒ„
  • ๋…ธ๋“œ v7.10.0.
  • ๋…ธ๋“œ๋ชฌ v1.11.0

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

๋‚˜๋Š” ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๊ณ  ์•„๋ฌด๋ฐ์„œ๋‚˜ ํŠ€์–ด ๋‚˜์˜ค๋Š” ๊ฒƒ ๊ฐ™์•˜์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์„ ๋‚ด ํ•ญ๋ชฉ js ํŒŒ์ผ์˜ ๋งจ ์•„๋ž˜์— ์ถ”๊ฐ€ํ•˜๊ธฐ ์‹œ์ž‘ํ•˜์—ฌ ์ด๊ฒƒ์ด ๋‚ด ์Šคํฌ๋ฆฝํŠธ์˜ ๋งˆ์ง€๋ง‰์œผ๋กœ ์‹คํ–‰๋œ ํ–‰์ด ๋˜๋„๋ก ํ–ˆ๊ณ , ๊ทธ๊ฒƒ์€ ๋‚˜๋ฅผ ์œ„ํ•ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์˜€์Šต๋‹ˆ๋‹ค. ๋„์›€์ด ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค!

CTRL+C์™€ OSX Sierra 10.12.5๋ฅผ ์‹คํ–‰ํ•˜๋Š” Mac์—์„œ iTerm์˜ nodemon ํ”„๋กœ์„ธ์Šค๋ฅผ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.

process.on('SIGINT', () => { console.log("Bye bye!"); process.exit(); });

๋ชจ๋“  100 ๋Œ“๊ธ€

์ด์ƒํ•˜๊ฒŒ๋„ ์—ฌ๊ธฐ์—์„œ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ „์— ์ด๊ฒƒ์„ ๊ฒฝํ—˜ํ•œ ์ ์ด ์—†์—ˆ๊ณ , ์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๊ธฐ ์œ„ํ•ด ๋ฌด์—‡์„ ์—…๋ฐ์ดํŠธํ–ˆ๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

OS X ์—˜ ์บํ”ผํƒ„
๋…ธ๋“œ v6.9.1
๋…ธ๋“œ๋ชฌ v1.11.0

์—ฌ๊ธฐ์—์„œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ต์Šคํ”„๋ ˆ์Šค ์„œ๋ฒ„์—์„œ๋„ EADDRINUSE ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

OS X ์‹œ์—๋ผ
๋…ธ๋“œ v6.10.3
๋…ธ๋“œ๋ชฌ v1.11.0

31960 ttys005    0:00.41 node /Users/harman.goei/.nvm/versions/node/v7.10.0/bin/nodemon -e ts --verbose --exec ts-node  lib/server.ts
31962 ttys005    0:00.10 node /Users/harman.goei/.nvm/versions/node/v7.10.0/bin/ts-node lib/server.ts
31963 ttys005    0:01.10 /Users/harman.goei/.nvm/versions/node/v7.10.0/bin/node /Users/harman.goei/.nvm/versions/node/v7.10.0/lib/node_modules/ts-node/d
ist/_bin.js lib/server.ts

nodemon์€ 31962๋ฅผ ์ƒ์„ฑํ•˜์ง€๋งŒ 31963์€ ์—ฌ์ „ํžˆ โ€‹โ€‹๊ทธ๋Œ€๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค(31963์€ 31962์˜ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค). ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋‹ค์‹œ ์‹œ์ž‘ํ•  ๋•Œ 31963์ด ์—ฌ์ „ํžˆ ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์—…๋ฐ์ดํŠธ:
๊ฒ€์ƒ‰ํ•˜๋ฉด SIGUSR2๊ฐ€ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ข…๋ฃŒํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. SIGHUP์ด ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„์ง ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ์€ ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๊ณ  ์•„๋ฌด๋ฐ์„œ๋‚˜ ํŠ€์–ด ๋‚˜์˜ค๋Š” ๊ฒƒ ๊ฐ™์•˜์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์„ ๋‚ด ํ•ญ๋ชฉ js ํŒŒ์ผ์˜ ๋งจ ์•„๋ž˜์— ์ถ”๊ฐ€ํ•˜๊ธฐ ์‹œ์ž‘ํ•˜์—ฌ ์ด๊ฒƒ์ด ๋‚ด ์Šคํฌ๋ฆฝํŠธ์˜ ๋งˆ์ง€๋ง‰์œผ๋กœ ์‹คํ–‰๋œ ํ–‰์ด ๋˜๋„๋ก ํ–ˆ๊ณ , ๊ทธ๊ฒƒ์€ ๋‚˜๋ฅผ ์œ„ํ•ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์˜€์Šต๋‹ˆ๋‹ค. ๋„์›€์ด ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค!

CTRL+C์™€ OSX Sierra 10.12.5๋ฅผ ์‹คํ–‰ํ•˜๋Š” Mac์—์„œ iTerm์˜ nodemon ํ”„๋กœ์„ธ์Šค๋ฅผ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.

process.on('SIGINT', () => { console.log("Bye bye!"); process.exit(); });

๊ฐ™์€ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. CTRL+C๋ฅผ ํ•ด์ œํ•˜๊ณ  npm start ๋‹ค์‹œ ์‹คํ–‰ํ•ด๋„ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.

$ npm start

> [email protected] start ter
> npm run build:live


> [email protected] build:live ter
> nodemon --exec ./node_modules/.bin/ts-node -- ./index.ts

[nodemon] 1.11.0
[nodemon] to restart at any time, enter `rs`
[nodemon] watching: *.*
[nodemon] starting `./node_modules/.bin/ts-node ./index.ts`
NodeJS server started...
[nodemon] restarting due to changes...
[nodemon] starting `./node_modules/.bin/ts-node ./index.ts`
[nodemon] restarting due to changes...
[nodemon] starting `./node_modules/.bin/ts-node ./index.ts`
NodeJS server started...
NodeJS server started...
Error: listen EADDRINUSE :::3000
    at Object.exports._errnoException (util.js:1016:11)
    at exports._exceptionWithHostPort (util.js:1039:20)
    at Server.setupListenHandle [as _listen2] (net.js:1307:14)
    at listenInCluster (net.js:1355:12)
    at Server.listen (net.js:1455:7)
    at Application.listen (/ter/node_modules/koa/lib/application.js:64:19)
    at Object.<anonymous> (/er/index.ts:9:5)
    at Module._compile (module.js:569:30)
    at Module.m._compile (ter/node_modules/ts-node/src/index.ts:379:23)
    at Module._extensions..js (module.js:580:10)
[nodemon] app crashed - waiting for file changes before starting...
^C
$ npm start

> [email protected] start ter
> npm run build:live


> [email protected] build:live ter
> nodemon --exec ./node_modules/.bin/ts-node -- ./index.ts

[nodemon] 1.11.0
[nodemon] to restart at any time, enter `rs`
[nodemon] watching: *.*
[nodemon] starting `./node_modules/.bin/ts-node ./index.ts`
NodeJS server started...

๊ฐ™์€ ๋ฌธ์ œ, ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๊นŒ?

[[16:13:36] [nodemon] restarting due to changes...
[16:13:36] [nodemon] starting `node test/phantomFlow/test/test.js --delay 2.5 --ignore test/`
Parallelising 1 test files on 1 processes.

Picking up job: flows\carepilotweb.test.js
events.js:160
      throw er; // Unhandled 'error' event
      ^

Error: listen EADDRINUSE :::9001
    at Object.exports._errnoException (util.js:1026:11)
    at exports._exceptionWithHostPort (util.js:1049:20)
    at Server._listen2 (net.js:1257:14)
    at listen (net.js:1293:10)
    at Server.listen (net.js:1389:5)
    at Function.app.listen (C:\workspace\deleteme_0420\carepilot-web\test\phantomFlow\node_modules\connect\lib\proto.js:232:24)
    at Object.<anonymous> (C:\workspace\deleteme_0420\carepilot-web\test\phantomFlow\test\test.js:46:4)
    at Module._compile (module.js:570:32)
    at Object.Module._extensions..js (module.js:579:10)
    at Module.load (module.js:487:32)
[16:13:36] [nodemon] app crashed - waiting for file changes before starting...
](url)

ํŽธ์ง‘ํ•˜๋‹ค:
์ด๋ ‡๊ฒŒ gulp ํŒŒ์ผ์„ ํŽธ์ง‘ํ•˜๋ฉด ์ž‘์—…์ž…๋‹ˆ๋‹ค.

gulp.task('report-debug', /*['clean-build-app-dev', 'validate-devserver-scripts'],*/ function(){
    // start nodemon to load test.js
    plugins.nodemon({ script: 'server/server.js', ext: 'js', watch: ['server/'], args:['--ignore', 'test/'], env: { NODE_ENV: 'development' } })
        .on('start', function () {
            plugins.nodemon({ script: 'test/phantomFlow/test/test.js', watch: ['server/'], args:['debug', '--ignore', 'test/'], stdout: false })
            .on('readable', function() {
                this.stdout.on('data', function(chunk) {
                    if (/Completed /.test(chunk)) {
                        const { exec } = require('child_process');
                        exec('node test/phantomFlow/test/test.js report', ['--ignore', 'test/']);
                    }
                    process.stdout.write(chunk);
                });
                this.stderr.pipe(process.stderr);
            });
        });
});

์—ฌ๊ธฐ์— ๋˜‘๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ํ…Œ์ŠคํŠธ ํ›„์— ์ฐพ์€ ์œ ์ผํ•œ ๊ฒƒ์€ Linux์—์„œ ์ƒˆ๋กœ ์„ค์น˜ํ•œ OS๋กœ ํ•ด๊ฒฐ๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ๋ฟ์ž…๋‹ˆ๋‹ค. ๋ฌผ๋ก  ๋งค๋ฒˆ ํด๋ฆฐ ์„ค์น˜๋Š” ํ•˜์ง€ ์•Š๊ณ  ๊ทธ๋ƒฅ ์–ด์Šฌ๋ ๊ฑฐ๋ฆฌ๊ธฐ๋งŒ ํ–ˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ OSX์—์„œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ๋…ธ๋“œ ํ”„๋กœ์„ธ์Šค ์‹คํ–‰ ์œ ์ง€(1.12.0)

์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์•„๋‹ˆ์š”, ์•„์ง ๋ฌธ์ œ์— ๋‹ค์‹œ ์ง๋ฉดํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. nodemon์ด ํ”„๋กœ์„ธ์Šค๋ฅผ ์žƒ๋Š” ์›์ธ์„ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

์–ด๋–ค ํ•ด๊ฒฐ์ฑ…์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” ๋˜ํ•œ ์šฐ๋ถ„ํˆฌ 16.04, nodemon 1.12.1 ๋ฐ node v8์—์„œ ์ด ๋ฌธ์ œ๋ฅผ ๊ฒฝํ—˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ์„ธ์Šค๋ฅผ ์ˆ˜๋™์œผ๋กœ ์ข…๋ฃŒํ•˜๋Š” ๊ฒƒ ์™ธ์—๋Š” ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด์ „ ์ฃผ์„์—์„œ ๋‚ด๊ฐ€ ํ•œ ์ผ์„ ๋” ์ž์„ธํžˆ ์„ค๋ช…ํ•˜์ž๋ฉด, ๋‚ด ํ”„๋กœ๊ทธ๋žจ์— ๋ณด๋‚ธ ์‹ ํ˜ธ( SIGUSR2 )๋กœ ์ธํ•ด ํ”„๋กœ๊ทธ๋žจ์ด ์ข…๋ฃŒ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  ์‹ ํ˜ธ๋ฅผ SIGHUP ๋กœ ๋ณ€๊ฒฝํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

nodemon.json ๋ผ๋Š” ํŒŒ์ผ์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

{
  "signal": "SIGHUP",
  "env": {
    "NODE_ENV": "development"
  },
  "ext": "ts",
  "exec": "ts-node --inspect ./lib/server.ts"
}

๋‚ด package.json์—์„œ npm ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— nodemon์„ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ถฉ๋ถ„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

"dev": "nodemon",

๋ฌธ์ œ๋Š” ts-node ์ž์ฒด์— ์žˆ์Šต๋‹ˆ๋‹ค. https://github.com/TypeStrong/ts-node/pull/458

Windows์—์„œ ์ด ์˜ค๋ฅ˜์˜ ์•ฑ/ํ”„๋กœ๊ทธ๋žจ์„ ์ œ๊ฑฐํ•˜๋ ค๋ฉด ํฌํŠธ 3000์—์„œ PID ํ”„๋กœ์„ธ์Šค๋ฅผ ์ข…๋ฃŒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ์ง„์งœ ๋ฌธ์ œ๋Š” nodemon ๊ฐ€ child_process.spawn ๋Œ€์‹  child_process.fork ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค๋Š” ๊ฒƒ ์ž…๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ๋ถ€๋ชจ๋ฅผ ์ฃฝ์ด๋Š” ๊ฒƒ์ด ์ž์‹์„ ์ฃฝ์ด๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค .

์ด์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์€ ๋…ธ๋“œ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ child_process.fork nodemon ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค( ๋…ธ๋“œ ๊ฐ€ ์•„๋‹Œ ์‹คํ–‰ ํŒŒ์ผ์˜ ๊ฒฝ์šฐ child_process.spawn ). ๋ถ€๋ชจ๊ฐ€ ์‚ฌ๋งํ•˜๋ฉด ํšจ๋ ฅ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

child_process.fork ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด process.send ๋ฐ process.on ๋ฉ”์„œ๋“œ๋ฅผ ํ”„๋กœ์„ธ์Šค ๊ฐ„ ํ†ต์‹ ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ถ€๋ชจ์™€ ์ž์‹ ๋…ธ๋“œ ํ”„๋กœ์„ธ์Šค ๊ฐ„์˜ ํ†ต์‹ ์— IPC ์ฑ„๋„์„ ์‚ฌ์šฉํ•˜๋Š” ์ถ”๊ฐ€ ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. .

์—ฌ๊ธฐ์— ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฐ„๋‹จํ•œ PR์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค(๊ทธ๋Ÿฌ๋‚˜ ์•„์ง CI ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•˜์ง€ ์•Š์Œ): https://github.com/remy/nodemon/pull/1134

๊ด€๋ฆฌ์ž๊ฐ€ ์ฝ”๋“œ๋ฅผ ๋”์šฑ ๊ตฌ์ฒดํ™”ํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๋˜๋Š” ๋‚˜์ค‘์— ๋„์›€์„ ์ค„ ์‹œ๊ฐ„์ด ์žˆ์œผ๋ฉด ๊ทธ๋ ‡๊ฒŒ ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ž„์‹œ ์ˆ˜์ • ์‚ฌํ•ญ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

// NOTE: this ONLY works when using nodemon as a `require` module.
// I don't have a solution for booting nodemon from the CLI. Sorry!

var nodemon = require('nodemon');

process

  // Handle normal exits
  .on('exit', (code) => {
    nodemon.emit('quit');
    process.exit(code);
  })

  // Handle CTRL+C
  .on('SIGINT', () => {
    nodemon.emit('quit');
    process.exit(0);
  });

tl;dr child_process.fork ๋Š” ๋ถ€๋ชจ๊ฐ€ ์ฃฝ์œผ๋ฉด ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ž๋™์œผ๋กœ ์ •๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€์žฅ ๊นจ๋—ํ•œ ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค. nodemon ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ˆ˜์ •๋˜์–ด์•ผ fork ๋ณด๋‹ค๋Š” spawn (๋Œ€ node ์‹คํ–‰ ์ „์šฉ).

์–ด๋–ค ๋ฐฉ๋ฒ•์ด ์˜ฌ๋ฐ”๋ฅธ์ง€ ์•Œ์•„๋‚ด๊ธฐ ์œ„ํ•ด ์ „์ฒด ํ›„ํ”„ ์ ํ”„๋ฅผ ๊ฑฐ์ณค๋˜ ๊ธฐ์–ต์ด ๋‚ฉ๋‹ˆ๋‹ค. IIRC spawn ๋Š” spawn์ด ๋‚˜์—๊ฒŒ ์ฃผ์—ˆ์ง€๋งŒ ํฌํฌ(์™ธ)๊ฐ€ ์ œ๊ณตํ•˜์ง€ ์•Š์€ ์ผ๋ถ€ ๋งํฌ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ํšจ๊ณผ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐ๋˜๋ฉด ๋ชจ๋“  ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•œ PR์„ ์ž์œ ๋กญ๊ฒŒ ๋ณด๋‚ด์ฃผ์‹ญ์‹œ์˜ค.

์•„, ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. PR์„ ๋†“์ณค์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋„ค, ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‹น์‹ ์ด ํฌํฌ๋ฅผ ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์Œ, ์˜ˆ, ์ œ๊ฐ€ ๋งํ–ˆ๋“ฏ์ด node ๋ฌธ์„œ์— ๋ช…์‹œ๋˜์–ด ์žˆ๋“ฏ์ด fork ๋Š” ํŠนํžˆ ์ž์‹ ๋…ธ๋“œ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋…ธ๋“œ ํ”„๋กœ์„ธ์Šค์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด๋ฉฐ spawn ๋Š” ๋‹ค๋ฅธ ๋ชจ๋“  ๋น„๋…ธ๋“œ ํ”„๋กœ์„ธ์Šค.

child_process.fork() ๋ฉ”์„œ๋“œ๋Š” ํŠนํžˆ ์ƒˆ Node.js ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” child_process.spawn()์˜ ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. child_process.spawn()๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ChildProcess ๊ฐ์ฒด๊ฐ€ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. ๋ฐ˜ํ™˜๋œ ChildProcess์—๋Š” ๋ถ€๋ชจ์™€ ์ž์‹ ๊ฐ„์— ๋ฉ”์‹œ์ง€๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ์ถ”๊ฐ€ ํ†ต์‹  ์ฑ„๋„์ด ๋‚ด์žฅ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ subprocess.send()๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.
https://nodejs.org/api/child_process.html#child_process_child_process_fork_modulepath_args_options

ํ™๋ณด๋ฅผ ๊ณ„์†ํ•  ์ˆ˜ ์žˆ์„์ง€ ์ง€์ผœ๋ด์•ผ๊ฒ ์ง€๋งŒ ์‹œ๊ฐ„์ด ์–ผ๋งˆ ์•ˆ ๊ฑธ๋ฆด ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. .apply ๋‹น์‹ ์ด ์ „ํ™”๋ฅผ ๊ฑธ ๋•Œ ์‚ฌ์šฉ spawn ๋‚˜๋Š” ์ •๊ธฐ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค, ์šฐ๋ฆฌ๊ฐ€ ์ฒ˜๋ฆฌ ํ•  ์ˆ˜์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์•„์•ผ ํ•  ๊ฒƒ stdin/out/err ์™€ ํ•จ๊ป˜ ํ•  ์ˆ˜์žˆ๋Š” silent: true ํฌํฌํ•  ๋•Œ ์˜ต์…˜์œผ๋กœ

ํ…Œ์ŠคํŠธ์—์„œ ํ•˜์œ„ PID๋ฅผ ํ™•์ธํ•˜๊ฑฐ๋‚˜ stdin/out์„ ํ™•์ธํ•˜๊ฑฐ๋‚˜ ..?

spawn ๊ฐ€ ์ €์žฅ์†Œ์— ๋Œ€ํ•œ ์œ ์ผํ•œ ๋‹ต์ด๋ผ๊ณ  ํ™•์‹ ํ•œ๋‹ค๋ฉด ์ƒ์„ฑ๋œ ์ž์‹์˜ PID๋ฅผ ์ €์žฅํ•˜๊ณ  .on('exit') , .on('SIGINT') ์ฃฝ์ด๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. etc... ๊ทธ๋ž˜๋„ fork ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ๋” ์‰ฌ์šธ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ๋„ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฉฐ์น  ์ „์— NodeJS 6.4.0์—์„œ NodeJS 8.90์œผ๋กœ ๋„˜์–ด๊ฐ„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

CTRL+C๋กœ nodemon ๋ฅผ ์ฒ˜์Œ ์ค‘์ง€ํ•œ ๋‹ค์Œ ๋‹ค์‹œ ์‹œ์ž‘ํ•ด์•ผ ํ•  ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ ๋งค๋ฒˆ [Windows 10] ์ž‘์—… ๊ด€๋ฆฌ์ž๋ฅผ ํ†ตํ•ด ๋…ธ๋“œ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ˆ˜๋™์œผ๋กœ ์ข…๋ฃŒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์—ฌ๊ธฐ์— ์žˆ์Šต๋‹ˆ๋‹ค.

$ node -v
v8.9.2

$ nodemon -v
1.12.5

@heisian ์˜ ์ž‘์—…์€ ์—ฌ๊ธฐ์—์„œ ๋ณ‘ํ•ฉ๋˜์—ˆ์œผ๋ฉฐ ์ด ๋ฌธ์ œ๋ฅผ ๋ชจ๋‘ ํ•ด๊ฒฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์—์„œ ๐Ÿ‘ ํ˜„์žฌ ๋ผ์ด๋ธŒ [email protected]

์‰ฟ! ๋„์›€์ด ๋˜์—ˆ๋‹ค๋‹ˆ ๊ธฐ์ฉ๋‹ˆ๋‹ค.

@heisian ๋ช‡ ๋น„ํŠธ๊ฐ€ ์—ฌ๊ธฐ ์ €๊ธฐ์— ๊ฒƒ๊ณผ ๊ด€๋ จ๋จ ).

ํ , ์•„๋งˆ๋„ run.js ๋‚ด์—์„œ ์ž์‹ ๋…ธ๋“œ ํ”„๋กœ์„ธ์Šค์— ๋Œ€ํ•œ ์ธ์ˆ˜๊ฐ€ ์ฐธ์กฐ๋˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๋ช…ํ™•ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๊นŒ?

forkArgs ๋ณ€์ˆ˜๋กœ ์ด๋™ํ•˜๊ธฐ ์œ„ํ•ด ๋…ธ๋“œ์— ์ „๋‹ฌํ•ด์•ผ ํ•˜๋Š” ๋ชจ๋“  ์ธ์ˆ˜๋ฅผ ์˜๋„ํ–ˆ์Šต๋‹ˆ๋‹ค.

child = fork(options.execOptions.script, forkArgs, {
...
});

์˜ˆ๋ฅผ ๋“ค์–ด ์ฝ”๋“œ๋ฅผ ๋ณ€ํ™˜ํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ถ„๊ธฐํ•ฉ๋‹ˆ๋‹ค.

child_process.fork('./', [
      '--out-dir', './dist',
      '--ignore', './coverage,./dist,./docs,./embed,node_modules,shared/cli,' +
      'shared/docker,bin/tools,admin/src,main/src,partner/src,*.swp,*.swo,' +
      'admin/build,main/build,partner/build,**/tests,shared/webpack,./stories',
      '--copy-files',
      // Presets/Plugins are defined in <project_root>/.babelrc
    ], {
      execPath: './node_modules/.bin/babel',
    });

์ด ๋ชจ๋“  ๊ฒƒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 ./node_modules/.bin/babel --out-dir ./dist --ignore ./coverage,./dist,./docs,./embed,node_modules,shared/cli,shared/docker,bin/tools,admin/src,main/src,partner/src,*.swp,*.swo,admin/build,main/build,partner/build,**/tests,shared/webpack,./stories --copy-files

์˜ˆ, ๋กœ์ปฌ ํ…Œ์ŠคํŠธ์—์„œ ์‹œ๋„ํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค. CLI ์ธ์ˆ˜์— ์žˆ์œผ๋ฉด ์‹ค์ œ๋กœ --inspect ์‚ญ์ œํ•˜๋Š” .splice(1) ๊ฐ€ ์žˆ์ง€๋งŒ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋””๋ฒ„๊ฑฐ๊ฐ€ ์—ด๋ ค ์žˆ์ง€ ์•Š์€ ๋ฉ”์ธ ๋…ธ๋“œ ํ”„๋กœ์„ธ์Šค(ํ˜„์žฌ nodemon.js๋ฅผ ์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ์„ธ์Šค)๋ฅผ ๋ถ„๊ธฐํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ง€๊ธˆ์€ ์†”๋ฃจ์…˜์„ ํ•ดํ‚นํ–ˆ์œผ๋ฉฐ(PR์˜ ์ฃผ์„ ์ฐธ์กฐ) ์ตœ์‹  ๋ฌธ์ œ๋ฅผ ์ˆ˜์ •ํ–ˆ์ง€๋งŒ ์ด๊ฒƒ์ด ๋ฐฉํƒ„์ธ์ง€ 100% ํ™•์‹ ํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค.

์Œ, ๊ฒ€ํ† ํ•˜๊ณ  ๋” ๋‚˜์€ ์†”๋ฃจ์…˜์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์˜ˆ, ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์‚ฌ์‹ค์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. --inspect ๋Š” ์ž์‹์—๊ฒŒ ์ „๋‹ฌ๋˜๋Š” ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค์— ํ”Œ๋ž˜๊ทธ๊ฐ€ ์ง€์ •๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

1.12.1 ์—์„œ 1.12.7 ๋กœ ์—…๋ฐ์ดํŠธ๋˜์—ˆ์ง€๋งŒ ๊ณ„์† ๋ฐ›๋Š” ์ค‘

Port xxxx is already in use
[nodemon] app crashed - waiting for file changes before starting...

Nodemon์„ ์ข…๋ฃŒํ•œ ํ›„ ๋‹ค์‹œ ์‹œ์ž‘ํ•  ๋•Œ(CTRL+C).

(Windows 10) ๋ฐ ์ถ”๊ฐ€ :heart: @remy์—๊ฒŒ !

๋ณ„๋„์˜ ๋ฌธ์ œ๋ฅผ ์ œ์ถœํ•˜๊ณ  Windows(git bash ๋“ฑ)์—์„œ ์‹คํ–‰ ํ•˜๋Š” ๋ฐฉ๋ฒ• ์—

@remy ํ™•์‹คํžˆ, #1164

์ต์Šคํ”„๋ ˆ์Šค ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š์ง€๋งŒ nodejs ๋„ท ์†Œ์ผ“์„ ์‹คํ–‰ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ nodemon -v์™€ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค: 1.14.2
๋…ธ๋“œ -v: 9.4
์šฐ๋ถ„ํˆฌ/์ œ๋‹ˆ์–ผ

๊ทธ๋ž˜์„œ ์•„๋งˆ๋„ ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ํ™๋ณด๊ฐ€ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ–ˆ์„๊นŒ์š”?

nodemon์ด ์ถฉ๋Œํ•˜์ง€ ์•Š์œผ๋ฉด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋”ฐ๋ผ ๋‹ค์‹œ ์‹œ์ž‘๋˜์ง€๋งŒ nodemon์ด ์ถฉ๋Œํ•˜๊ฑฐ๋‚˜ ์ข…๋ฃŒํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ์†Œ์ผ“์„ ๊ณ„์† ์‹คํ–‰ํ•˜๊ณ  nodemon์„ ๋‹ค์‹œ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— pkill node ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ํฌํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์˜ค๋ฅ˜.

์ฐธ๊ณ : ๋„ท ์†Œ์ผ“์„ ์‹œ์ž‘ํ•˜๋Š” ๋‚ด ๋ชจ๋“ˆ์—๋Š” ํ‚ฌ ์ฝ”๋“œ๊ฐ€ ๋‚ด์žฅ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ cntrl-c(SIGUP)์™€ ๊ฐ™์ด ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ฐ‘์ž๊ธฐ ์ข…๋ฃŒ๋˜๋ฉด ์†Œ์ผ“์ด ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค. ์ฐธ๊ณ ๋กœ ์ €๋Š” on-death ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

babel์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  nodemon --require @std/esm ์—์„œ์™€ ๊ฐ™์ด @std/esm์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋จผ์ € ์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‹ค์ œ๋กœ ๋ถ„๊ธฐ๋˜๊ณ  ์ƒ์„ฑ๋˜์ง€ ์•Š์•˜๋Š”์ง€ ํ™•์ธํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ž์‹ ํ”„๋กœ์„ธ์Šค์—์„œ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ:

process.send('some message')
// Should not throw an error

...๊ทธ๋ฆฌ๊ณ  ๋ถ€๋ชจ๋‹˜์—๊ฒŒ์„œ ์„ฑ๊ณต์ ์œผ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

process.on('message', function(message) {
  process.stdout.write(message)
})
// Should output 'some message'

...๊ทธ๋Ÿฌ๋ฉด ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‹ค์ œ๋กœ child_process.fork ๋กœ ๋ถ„๊ธฐ๋˜์—ˆ์œผ๋ฉฐ ๋ถ€๋ชจ๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ ์ •์ƒ์ ์œผ๋กœ ์ข…๋ฃŒ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์œ„์˜ ๋ฐฉ๋ฒ•์ด ์ž‘๋™ํ•˜์ง€ ์•Š์œผ๋ฉด ์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ€ spawned ์ด๋ฏ€๋กœ SIGKILL process.on('exit') ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์Šค์Šค๋กœ ์•Œ์•„๋‚ด์•ผ ํ•ฉ๋‹ˆ๋‹ค

๋‚˜๋Š” ๋˜ํ•œ ์ตœ์‹  ๋ฒ„์ „์˜ nodemon:1.17.3 ์ค‘ ํ•˜๋‚˜์—์„œ ์ด๊ฒƒ์„ ๊ฒฝํ—˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค

๋˜ํ•œ macOS High Sierra v10.13.4์—์„œ nodemon 1.17.3, node 9.2.0์—์„œ ์ด๊ฒƒ์„ ๊ฒฝํ—˜ํ–ˆ๋Š”๋ฐ, ์œ„์˜ @johnnydimas ํ•œ ๋ผ์ด๋„ˆ ์†”๋ฃจ์…˜์œผ๋กœ ์ง€๊ธˆ๊นŒ์ง€ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Ubuntu 18.04 ๋ฐ 17.10์—์„œ๋„ ์ด๊ฒƒ์„ ์–ป์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ๋„ ๊ฐ€์ง€๊ณ ! ๋ชจ๋“  ํŒจํ‚ค์ง€๋ฅผ ์ตœ์‹  ์ƒํƒœ๋กœ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
macOS High Sierra v10.13.2์—์„œ

@lukebrewerton @MissAnichka @danielo515 @cormickjbrowne @ajones @sinonkt @nodediggity
์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.
์‹ค์ œ๋กœ๋Š” nodemon์ด ์•„๋‹ˆ๋ผ babel-node์ž…๋‹ˆ๋‹ค!
npm i kexec -D ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค

์„ค๋ช…:
https://github.com/babel/babel/issues/1062#issuecomment -84526036

ํŽธ์ง‘ํ•˜๋‹ค:
์•ฝ๊ฐ„ ์—ด๊ด‘ํ–ˆ๊ณ  ๋‹ค๋ฅธ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๊ณ ๋ คํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ babel-node๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ =D๋ฅผ ํ†ตํ•ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” babel์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ํ‰๋ฒ”ํ•œ ์˜ค๋ž˜๋œ ๋…ธ๋“œ js๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋…ธ๋“œ 9.5๊ฐ€ ์žˆ๋Š” nodemon 1.17.5์—์„œ ์—ฌ์ „ํžˆ ์ด๊ฒƒ์„ ์–ป๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋ถˆํ–‰ํžˆ๋„ node -r ts-node/register index.ts ์‹คํ–‰ ์ค‘์ž…๋‹ˆ๋‹ค.

@Kamshak ์ƒˆ ๋ฌธ์ œ๋ฅผ ์—ด๊ณ  ๋ณต์ œ ๊ฐ€๋Šฅํ•œ ์˜ˆ์ œ๋กœ ์š”์•ฝ๋œ index.ts๋ฅผ ํฌํ•จํ•˜์‹ญ์‹œ์˜ค.

macOS 10.13.3์˜ nodemon 1.18.3 ๋ฐ node 8.11.4์—์„œ ์—ฌ์ „ํžˆ ์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋™์ผํ•œ ๋ฌธ์ œ.... Ubuntu 18.04 LTS์˜ nodemon 1.18.3 ๋ฐ ๋…ธ๋“œ 8.11.4. ๋˜ํ•œ ๋ช…์‹œ ์ ์œผ๋กœ SIGHUP์„ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ข…๋ฃŒํ•˜๊ณ  2500ms์˜ ์ถ”๊ฐ€ ์ง€์—ฐ์„ ์ถ”๊ฐ€ํ•˜์—ฌ nodemon ๊ตฌ์„ฑ ๊ฒฝ๋กœ๋ฅผ ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค ..... ๋ถˆํ–‰ํžˆ๋„ ๊ธฐ์จ์ด ์—†์Šต๋‹ˆ๋‹ค ....

WebStorm ํ„ฐ๋ฏธ๋„ ํŒจ๋„์„ ํ†ตํ•ด nodemon์„ ์‹คํ–‰ํ•˜๊ณ  IDE๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•œ ํ›„(๋˜๋Š” ํ„ฐ๋ฏธ๋„ ํŒจ๋„์„ ๋‹ค์‹œ ์—ฐ ํ›„) EADDRINUSE๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ํ”„๋กœ์„ธ์Šค ๋ชฉ๋ก์— ๋ˆ„๋ฝ๋œ nodemon ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋‚จ์•„ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค. ์šฐ๋ถ„ํˆฌ 18.04์—์„œ ๋‚˜์—๊ฒŒ ์ผ์–ด๋‚ฌ์Šต๋‹ˆ๋‹ค.

ํžŒํŠธ๋ฅผ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค @dchekanov . vscode๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด์™€ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. nodemon์ด ๋‹ค์‹œ ์‹œ์ž‘ํ•˜๋ ค๊ณ  ํ•  ๋•Œ๋งˆ๋‹ค EADDRINUSE ์˜ค๋ฅ˜๊ฐ€ ์•ˆ์ •์ ์œผ๋กœ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋‘ nodemon ํ”„๋กœ์„ธ์Šค ์‚ฌ์ด์— ์ผ์ข…์˜ ๊ฒฝ์Ÿ ์กฐ๊ฑด์ด ๋˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค.

๋‚˜๋„ ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ์•ˆ๊ณ ์žˆ์–ด.
๋…ธ๋“œ๋ชฌ -v 1.18.4
๋…ธ๋“œ -v v8.11.1
macOS ๋ชจํ•˜๋น„ ๋ฒ„์ „ 10.14
VSCode ํ„ฐ๋ฏธ๋„

๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. https://github.com/aecorredor/express-graphql-postgres-starter ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ๋ณต์ œํ•˜๊ณ  yarn ๋ฅผ ์‹คํ–‰ํ•œ ๋‹ค์Œ yarn start ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๋ณ€๊ฒฝํ•˜๊ณ  ์ €์žฅํ•˜๊ณ  ์˜ค๋ฅ˜๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. . ๋‚˜๋Š” ๋™์‹œ์— ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์— ์œ ์˜ํ•˜์‹ญ์‹œ์˜ค. ๋‚œ ๊ทธ๋ƒฅ nodemon --exec babel-node index.js

๊ฐ™์€ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. 1.18.6.
Ubuntu์˜ Docker์—์„œ ์‹คํ–‰, ๋…ธ๋“œ 10.11

์—ฌ๊ธฐ์„œ๋„ ๊ฐ™์€ ๋ฌธ์ œ!

๊ทธ๊ฒƒ์€ ๋‚˜๋ฅผ ๋„์™”๋‹ค
yarn add --dev kexec

์ €๋„ ์ตœ๊ทผ์— ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค....
์•„๋งˆ๋„ ๋„์ปค ์—…๊ทธ๋ ˆ์ด๋“œ์˜ ์›์ธ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค ... ์ด์œ ๋ฅผ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค ...
์—๋“œ๋ฆฌ๋ˆ„์ฆˆ...

์•ˆ๋…•ํ•˜์„ธ์š” @justintien ,

๋‚˜๋Š” nodemon์—์„œ ์ด ๋ฌธ์ œ์— ์—ฌ๋Ÿฌ ๋ฒˆ ์ง๋ฉดํ–ˆ์ง€๋งŒ ํ”„๋กœ๋•์…˜์—์„œ ์‚ฌ์šฉํ•˜๋Š” pm2 ํŒจํ‚ค์ง€(http://pm2.keymetrics.io/)๋กœ ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค.

์ถ”๊ฐ€ํ•˜๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‹œ์ž‘ํ•˜์‹ญ์‹œ์˜ค. pm2 start src/server.ts --watch --no-daemon
ES6 ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ typescript ๋ชจ๋“ˆ์„ ์‚ฌ์ „ ์„ค์น˜ํ•ด์•ผ ํ•˜๋ฉฐ ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ postintall์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
"postinstall": "$(yarn bin)/pm2 install typescript"

์ด ๋„์›€์„ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๋‚˜๋ฅผ ์œ„ํ•ด ์ผํ•œ ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์€ "signal": "SIGTERM", ์„ nodemon.json ์ž…๋‹ˆ๋‹ค.

์ €๋Š” Yarn, Docker ๋ฐ Alpine 10์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

@lukebrewerton @MissAnichka @danielo515 @cormickjbrowne @ajones @sinonkt @nodediggity
์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.
์‹ค์ œ๋กœ๋Š” nodemon์ด ์•„๋‹ˆ๋ผ babel-node์ž…๋‹ˆ๋‹ค!
npm i kexec -D ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค

์„ค๋ช…:
babel/babel#1062 (๋Œ“๊ธ€)

ํŽธ์ง‘ํ•˜๋‹ค:
์•ฝ๊ฐ„ ์—ด๊ด‘ํ–ˆ๊ณ  ๋‹ค๋ฅธ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๊ณ ๋ คํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ babel-node๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ =D๋ฅผ ํ†ตํ•ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ตœ์‹  ๋ฒ„์ „์œผ๋กœ ์—…๋ฐ์ดํŠธ๋œ ๋ชจ๋“  ํŒจํ‚ค์ง€์— ์—ฌ์ „ํžˆ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ kexec ํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋“  ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ kexec ํŒจํ‚ค์ง€๊ฐ€ ์ ๊ทน์ ์œผ๋กœ ์œ ์ง€ ๊ด€๋ฆฌ๋˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์•„์„œ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

1.18.6์„ ์‚ฌ์šฉํ•˜์—ฌ npmi kexex ๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ๋ถ„, ์ด๊ฒƒ์€ ํ์‡„์ ์ด๊ณ  ์ง€์›๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ์ตœ์‹  nodemon์—์„œ ๋ณด๊ณ  ์žˆ๋Š” ๋ฒ„๊ทธ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ๋ณต์ œ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์™„์ „ํ•œ ์ง€์นจ๊ณผ ํ•จ๊ป˜ ์ƒˆ๋กœ์šด ๋ฌธ์ œ๋ฅผ ๋ณด๊ณ ํ•˜์‹ญ์‹œ์˜ค.

๋‚˜๋Š” ์ด๋ฏธ ๊ฐ™์€ ๋ฌธ์ œ์— ๋Œ€ํ•ด ์ด๊ฒƒ์„ ๋งํ–ˆ์Œ์„ ์ฃผ๋ชฉํ•˜์‹ญ์‹œ์˜ค.

๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋‚ด๊ฐ€ ๋‹ซํžŒ ๋ฌธ์ œ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•„์ฃผ์„ธ์š”.

๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ yarn global add nodemon@next ๋ช…๋ น์œผ๋กœ 1.12.6 ๋ฒ„์ „์„ ์„ค์น˜ํ•˜์—ฌ ์ œ๊ฑฐํ•œ ๋‹ค์Œ ๋ชฉ๋ก์—์„œ 1.12.6 ๋ฒ„์ „์„ ์„ ํƒํ•˜๊ฑฐ๋‚˜ ๊ฐ„๋‹จํžˆ yarn global add [email protected] ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค @remy ์†”๋ฃจ์…˜: https://github.com/remy/nodemon/issues/1025#issuecomment -351394591

๋„์ปค: ๋…ธ๋“œ:10-์•ŒํŒŒ์ธ
๋…ธ๋“œ: v10.6.0
๋…ธ๋“œ๋ชฌ: v1.18.7

์ด์œ ๋ฅผ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค.

PID   USER     TIME   COMMAND
    1 root       0:00 /bin/sh -c npm i npm run dev -- -L
   16 root       0:00 sh
   22 root       0:00 npm
   32 root       0:00 sh -c nodemon ./src --exec babel-node "-L"
   33 root       0:01 node /app/node_modules/.bin/nodemon ./src --exec babel-node -L
   46 root       0:00 sh -c babel-node ./src
   47 root       0:00 node /app/node_modules/.bin/babel-node ./src
   53 root       0:00 /usr/local/bin/node /app/node_modules/babel-cli/lib/_babel-node ./src

# if watch change, restarting due to changes...
# after: it's didn't kill sub child -> 47 & 53
    1 root       0:00 /bin/sh -c npm i npm run dev -- -L
   16 root       0:00 sh
   22 root       0:00 npm
   32 root       0:00 sh -c nodemon ./src --exec babel-node "-L"
   33 root       0:15 node /app/node_modules/.bin/nodemon ./src --exec babel-node -L
   47 root       0:00 node /app/node_modules/.bin/babel-node ./src
   53 root       0:09 /usr/local/bin/node /app/node_modules/babel-cli/lib/_babel-node ./src
   78 root       0:00 sh -c babel-node ./src
   79 root       0:00 node /app/node_modules/.bin/babel-node ./src
   85 root       0:01 /usr/local/bin/node /app/node_modules/babel-cli/lib/_babel-node ./src

๋‚˜๋Š” ์ด๋ฏธ ์‹œ๋„:

  • "signal": "SIGTERM", nodemon.json์œผ๋กœ.
  • npm i -D kexc ( babel-node ๊ฐ€ ๋จผ์ € kexec ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ์˜ค๋ฅ˜ ๋ฐœ์ƒ)
app_1    | /app/node_modules/babel-cli/lib/babel-node.js:70
app_1    |     if (err.code !== "MODULE_NOT_FOUND") throw err;
app_1    |                                          ^
app_1    |
app_1    | Error: Error loading shared library /app/node_modules/kexec/build/Release/kexec.node: Exec format error
app_1    |     at Object.Module._extensions..node (internal/modules/cjs/loader.js:718:18)
app_1    |     at Module.load (internal/modules/cjs/loader.js:599:32)
app_1    |     at tryModuleLoad (internal/modules/cjs/loader.js:538:12)
app_1    |     at Function.Module._load (internal/modules/cjs/loader.js:530:3)
app_1    |     at Module.require (internal/modules/cjs/loader.js:637:17)
app_1    |     at require (internal/modules/cjs/helpers.js:20:18)
app_1    |     at Object.<anonymous> (/app/node_modules/kexec/index.js:1:80)
app_1    |     at Module._compile (internal/modules/cjs/loader.js:689:30)
app_1    |     at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10)
app_1    |     at Module.load (internal/modules/cjs/loader.js:599:32)

@mohamed-badaoui
ํ”„๋กœ๋•์…˜์—์„œ๋Š” nodemon์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๊ฐœ๋ฐœ์ž์šฉ์œผ๋กœ๋งŒ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.
ํ”„๋กœ๋•์…˜์—์„œ ๋„์ปค๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. :๋ถ‰ํžˆ๋‹ค:

[email protected] ๋ฐ [email protected] ๋ฌธ์ œ์— ์ง๋ฉดํ–ˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ nodemone์„ 1.18.8๋กœ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ–ˆ๊ณ , ์ด์ œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค โœ…

TS ๋ฐ Apollo ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

@alienalien13์ด ๋งํ•œ ๊ฒƒ์„ ํ™•์ธํ•˜๋ฉด์„œ ์ €๋Š” Nodemon 1.18.9 ๋ฐ NodeJS 11.4.0 ์‹คํ—˜ ์ค‘์ž…๋‹ˆ๋‹ค.

์†Œ์‹!

1.18.9๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๋ฉด ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค!!

์—„์ฒญ๋‚œ!!

@mohamed-badaoui

๊ณ ๋งˆ์›Œ ์นœ๊ตฌ ! ํ”ผ๋“œ๋ฐฑ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค โœŒ

์ด์ „ ์ฃผ์„์—์„œ ๋‚ด๊ฐ€ ํ•œ ์ผ์„ ๋” ์ž์„ธํžˆ ์„ค๋ช…ํ•˜์ž๋ฉด, ๋‚ด ํ”„๋กœ๊ทธ๋žจ์— ๋ณด๋‚ธ ์‹ ํ˜ธ( SIGUSR2 )๋กœ ์ธํ•ด ํ”„๋กœ๊ทธ๋žจ์ด ์ข…๋ฃŒ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  ์‹ ํ˜ธ๋ฅผ SIGHUP ๋กœ ๋ณ€๊ฒฝํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

nodemon.json ๋ผ๋Š” ํŒŒ์ผ์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

{
  "signal": "SIGHUP",
  "env": {
    "NODE_ENV": "development"
  },
  "ext": "ts",
  "exec": "ts-node --inspect ./lib/server.ts"
}

๋‚ด package.json์—์„œ npm ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— nodemon์„ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ถฉ๋ถ„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

"dev": "nodemon",

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์œผ๋กœ "signal": "SIGHUP" ์ถ”๊ฐ€ํ•˜๋ฉด ์ €์—๊ฒŒ ํšจ๊ณผ์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

@Mutmatt nodemon v1.18.10์€ "์•Œ ์ˆ˜ ์—†๊ฑฐ๋‚˜ ์˜ˆ๊ธฐ์น˜ ์•Š์€ ์˜ต์…˜: --inspect"๋ฅผ ์•Œ๋ ค์ค๋‹ˆ๋‹ค.

@bennyn package.json ์œ ํ˜• ๋ช…๋ น์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ: nodemon.json

{
  "signal": "SIGHUP",
  "ext": "ts",
  "exec": "npm run serve",
  "watch": ["src"]
}

์•Œ ๊ฒ ์–ด์š”! ๋”ฐ๋ผ์„œ ts-node ์—์„œ ์ œ๊ฑฐ๋œ ํ”Œ๋ž˜๊ทธ์ž…๋‹ˆ๋‹ค. ๋ฏธ์•ˆํ•ฉ๋‹ˆ๋‹ค ์ œ ์ž˜๋ชป์ž…๋‹ˆ๋‹ค. ๐Ÿ™ˆ

์—ฌ๊ธฐ์„œ๋„ ๊ฐ™์€ ๋ฌธ์ œ
Error: listen EADDRINUSE
nodemon: 1.18.11
node: 10.14.1

๋ชจ๋“  ๊ฒƒ์ด ๋‚˜๋ฅผ ์œ„ํ•ด ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค :(
ts-node + nodemon ์‚ฌ์šฉ

๋‚˜๋Š” Visual Studio ํ„ฐ๋ฏธ๋„, ์šฐ๋ถ„ํˆฌ 18์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ๊ณ , ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์€ ํ„ฐ๋ฏธ๋„์„ ์ข…๋ฃŒํ•˜๊ณ  ํ”„๋กœ์„ธ์Šค๋ฅผ ์ฐพ์•„ ์ข…๋ฃŒํ•˜๋Š” ๊ฒƒ์ด ์—ˆ์Šต๋‹ˆ๋‹ค.
Visual Studio ์™ธ๋ถ€์—์„œ ์ƒˆ ํ„ฐ๋ฏธ๋„ ์‹œ์ž‘
๊ทธ๋ž˜์„œ ๊ทธ๊ฒƒ์€ ๋‚˜๋ฅผ ์œ„ํ•ด ์ผํ–ˆ์Šต๋‹ˆ๋‹ค.

์œ„๋กœ

์ „์—ญ์ ์œผ๋กœ nodemon์ด ์„ค์น˜๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค. ๊ทธ๊ฒƒ์„ ์ œ๊ฑฐํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

ํ™˜๊ฒฝ ๋ณ€์ˆ˜์— dotenv ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ๋Š”๋ฐ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋ฅผ ์œ„ํ•ด ๊ทธ๊ฒƒ์€ '.env'ํŒŒ์ผ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฑด ๋งˆ์น˜:
PORT=3000,

json์—์„œ ๋ณต์‚ฌํ•˜์—ฌ ๋ถ™์—ฌ๋„ฃ๋Š” ๊ฒฝ์šฐ ์‰ผํ‘œ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์„ ์žŠ์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

์ด๊ฒƒ์ด ๋‚˜๋ฅผ ์œ„ํ•ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐ ํ•œ ๊ฒƒ
npm cache clean -force

"autoAttachChildProcesses": true ์˜ต์…˜์ด ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

"autoAttachChildProcesses" ์˜ต์…˜: true๋กœ ํ•ด๊ฒฐ๋จ

nodemon.json ์—์„œ ๊ตฌ์„ฑํ–ˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ์ด ์˜ต์…˜์„ ์–ด๋””์— ๋ฐฐ์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

์ง€๊ธˆ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚จ์•„ ์žˆ๋Š” ๊ฒƒ์ด ์žˆ์ง€๋งŒ ์—†๋Š” ๊ฒƒ ๊ฐ™์œผ๋ฉด ์ด๋ฒคํŠธ ๋ฃจํ”„๋ฅผ ๋””๋ฒ„๊ทธํ•˜๋ ค๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค.

"nodemon": "^1.19.1",
node: v10.16.2
npm: 6.9.0

๋ˆ„๊ตฌ๋“ ์ง€ ์ด์— ๋Œ€ํ•œ ์ ์ ˆํ•˜๊ณ  ๊นจ๋—ํ•œ ์†”๋ฃจ์…˜์„ ์•Œ์•„ ๋ƒˆ์Šต๋‹ˆ๊นŒ?

Windows์—์„œ "node.exe Node.js: ์„œ๋ฒ„ ์ธก JavaScript" ํ”„๋กœ์„ธ์Šค๋ฅผ ์ค‘์ง€ํ•ฉ๋‹ˆ๋‹ค.

์„œ๋ฒ„๋ฅผ ์‹œ์ž‘ํ•˜๋Š” js ํŒŒ์ผ์˜ ๋งจ ์•„๋ž˜์— ๋‹ค์Œ์„ ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค.
process.on('SIGINT', () => { console.log("Bye bye!"); process.exit(); })

์ฒœ๋งŒ์—์š”!

์ฐธ๊ณ ๋กœ ์—ฌ์ „ํžˆ ์–ด๋ ค์›€์„ ๊ฒช๊ณ  ์žˆ๋Š” ์‚ฌ๋žŒ์ด ์žˆ๋‹ค๋ฉด ๋‹ค์Œ๋„ ์‹œ๋„ํ•ด ๋ณด์„ธ์š”.
๋‚˜๋Š” ์›์‚ฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ๊ฐ„๋‹จํ•œ yarn cache clean ๊ฐ€ ๋‚˜๋ฅผ ์œ„ํ•ด ๋งˆ์ˆ ์„ ๋ถ€๋ ธ๋‹ค.
npm ์‚ฌ์šฉ์ž์˜ ๊ฒฝ์šฐ npm cache clean ์‹œ๋„ํ•˜์‹ญ์‹œ์˜ค.

๊ทธ๋ž˜์„œ nodemon์ด ์‹คํ–‰๋  ๋•Œ ์ฃฝ์ด๋Š” ๋ฐฉ๋ฒ•์€ ์—†๋‚˜์š”???

์ตœ์‹  nodemon์œผ๋กœ ์—…๋ฐ์ดํŠธํ•˜๊ณ  NPM ์—…๊ทธ๋ ˆ์ด๋“œ์™€ ํ•จ๊ป˜ ๋…ธ๋“œ 6์—์„œ 10์œผ๋กœ ์ด๋™ํ•˜์—ฌ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
"๋…ธ๋“œ๋ชฌ": "^1.19.2",
๋…ธ๋“œ: 10.16.0
npm: 6.9.0

@doc82 ์ด ํŠน์ • ๋ฌธ์ œ๋Š” ๋งค์šฐ ๋ณต์žกํ•˜๋ฉฐ ๋งค๋ฒˆ ๋™์ผํ•œ ๊ฒฝ์šฐ๊ฐ€ ๊ฑฐ์˜ ์—†์Šต๋‹ˆ๋‹ค.

๋ณต์ œ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์œผ๋กœ ์ƒˆ๋กœ์šด ๋ฌธ์ œ๋ฅผ ์ œ๊ธฐํ•˜๊ณ  ์‹ถ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด 10๋ฒˆ ์ค‘ 9๋ฒˆ์€ nodemon์ด ํ”„๋กœ์ ํŠธ์—์„œ ์‹คํ–‰๋˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ธํ•ด "์„œ๋ธŒ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ค‘๋‹จ๋จ"์ด ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค

[nodemon] ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•ด ๋‹ค์‹œ ์‹œ์ž‘ ์ค‘...
[๋…ธ๋“œ๋ชฌ] ์‹œ์ž‘ node server.js
์ด๋ฒคํŠธ.js:183
๋˜์ ธ ์–ด; // ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์€ '์˜ค๋ฅ˜' ์ด๋ฒคํŠธ
^^

์˜ค๋ฅ˜: EADDRINUSE :::3000 ๋“ฃ๊ธฐ
Object._errnoException์—์„œ(util.js:1022:11)
_exceptionWithHostPort์—์„œ(util.js:1044:20)
Server.setupListenHandle์—์„œ [as _listen2](net.js:1367:14)
listenInCluster์—์„œ(net.js:1408:12)
Server.listen์—์„œ (net.js:1492:7)
๊ฐœ์ฒด์—์„œ.(/home/dg/junesis/server.js:8:8)
Module._compile์—์„œ (module.js:652:30)
Object.Module._extensions..js์—์„œ (module.js:663:10)
Module.load์—์„œ (module.js:565:32)
tryModuleLoad์—์„œ(module.js:505:12)
Function.Module._load์—์„œ (module.js:497:3)
Function.Module.runMain์—์„œ (module.js:693:10)
์‹œ์ž‘ ์‹œ(bootstrap_node.js:188:16)
bootstrap_node.js:609:3์—์„œ
[nodemon] ์•ฑ ์ถฉ๋Œ - ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ํŒŒ์ผ ๋ณ€๊ฒฝ ๋Œ€๊ธฐ ์ค‘...
[nodemon] ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•ด ๋‹ค์‹œ ์‹œ์ž‘ ์ค‘...
[๋…ธ๋“œ๋ชฌ] ์‹œ์ž‘ node server.js
ํฌํŠธ 3000์—์„œ ์ˆ˜์‹  ๋Œ€๊ธฐ ์ค‘...
[nodemon] ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•ด ์žฌ์‹œ์ž‘ ์ค‘...
[๋…ธ๋“œ๋ชฌ] ์‹œ์ž‘ node server.js
์ด๋ฒคํŠธ.js:183
๋˜์ง€๋‹ค ์–ด; // ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์€ '์˜ค๋ฅ˜' ์ด๋ฒคํŠธ
^^

์˜ค๋ฅ˜: EADDRINUSE :::3000 ๋“ฃ๊ธฐ
Object._errnoException์—์„œ(util.js:1022:11)
_exceptionWithHostPort์—์„œ(util.js:1044:20)
Server.setupListenHandle์—์„œ [_listen2๋กœ](net.js:1367:14)
listenInCluster์—์„œ(net.js:1408:12)
Server.listen์—์„œ (net.js:1492:7)
๊ฐœ์ฒด์—์„œ.(/home/dg/junesis/server.js:8:8)
Module._compile์—์„œ (module.js:652:30)
Object.Module._extensions..js์—์„œ (module.js:663:10)
Module.load์—์„œ (module.js:565:32)
tryModuleLoad์—์„œ(module.js:505:12)
Function.Module._load์—์„œ (module.js:497:3)
Function.Module.runMain์—์„œ (module.js:693:10)
์‹œ์ž‘ ์‹œ(bootstrap_node.js:188:16)
bootstrap_node.js:609:3์—์„œ
[nodemon] ์•ฑ ์ถฉ๋Œ - ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ํŒŒ์ผ ๋ณ€๊ฒฝ ๋Œ€๊ธฐ ์ค‘...
[nodemon] ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•ด ์žฌ์‹œ์ž‘ ์ค‘...
[๋…ธ๋“œ๋ชฌ] ์‹œ์ž‘ node server.js
ํฌํŠธ 3000์—์„œ ์ˆ˜์‹  ๋Œ€๊ธฐ ์ค‘...

๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๊ฐ€ ํ‘œ์‹œ๋˜๋Š” ๊ฒฝ์šฐ:

์˜ค๋ฅ˜: '/home/dg/junesis/node_modules/bcrypt/lib/binding/bcrypt_lib.node' ๋ชจ๋“ˆ
๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค๋ฅธ Node.js ๋ฒ„์ „์— ๋Œ€ํ•ด ์ปดํŒŒ์ผ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
NODE_MODULE_VERSION 57. ์ด ๋ฒ„์ „์˜ Node.js์—๋Š” ๋‹ค์Œ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
NODE_MODULE_VERSION 64. ๋‹ค์‹œ ์ปดํŒŒ์ผํ•˜๊ฑฐ๋‚˜ ๋‹ค์‹œ ์„ค์น˜ํ•˜์‹ญ์‹œ์˜ค.
๋ชจ๋“ˆ(์˜ˆ: npm rebuild ๋˜๋Š” npm install ).
Object.Module._extensions..node์—์„œ (internal/modules/cjs/loader.js:807:18)
Module.load์—์„œ (internal/modules/cjs/loader.js:653:32)
tryModuleLoad์—์„œ(internal/modules/cjs/loader.js:593:12)
Function.Module._load์—์„œ (internal/modules/cjs/loader.js:585:3)
Module.require์—์„œ(internal/modules/cjs/loader.js:692:17)
ํ•„์š” ์‹œ(internal/modules/cjs/helpers.js:25:18)
๊ฐœ์ฒด์—์„œ.(/home/dg/junesis/node_modules/bcrypt/bcrypt.js:6:16)
Module._compile์—์„œ (internal/modules/cjs/loader.js:778:30)
Object.Module._extensions..js์—์„œ (internal/modules/cjs/loader.js:789:10)
Module.load์—์„œ (internal/modules/cjs/loader.js:653:32)
tryModuleLoad์—์„œ(internal/modules/cjs/loader.js:593:12)
Function.Module._load์—์„œ (internal/modules/cjs/loader.js:585:3)
Module.require์—์„œ(internal/modules/cjs/loader.js:692:17)
ํ•„์š” ์‹œ(internal/modules/cjs/helpers.js:25:18)
๊ฐœ์ฒด์—์„œ.(/home/dg/junesis/server/controller/userController.js:2:16)
Module._compile์—์„œ (internal/modules/cjs/loader.js:778:30)
[nodemon] ์•ฑ ์ถฉ๋Œ - ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ํŒŒ์ผ ๋ณ€๊ฒฝ ๋Œ€๊ธฐ ์ค‘...

๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
rm -rf node_modules/bcrypt
npm ์„ค์น˜

๊ทธ๋Ÿฌ๋‚˜ ๋‚ด ํ•ญ๋ชฉ ํŒŒ์ผ์—์„œ ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.
ํ”„๋กœ์„ธ์Šค
// ์ผ๋ฐ˜ ์ข…๋ฃŒ ์ฒ˜๋ฆฌ
.on('์ข…๋ฃŒ', (์ฝ”๋“œ) => {
nodemon.emit('์ข…๋ฃŒ');
process.exit(์ฝ”๋“œ);
})

// Handle CTRL+C
.on('SIGINT', () => {
    nodemon.emit('quit');
    process.exit(0);
});

https://github.com/remy/nodemon/issues/1025#issuecomment -345361918 ๋•๋ถ„์—

Windows์—์„œ "node.exe Node.js: ์„œ๋ฒ„ ์ธก JavaScript" ํ”„๋กœ์„ธ์Šค๋ฅผ ์ค‘์ง€ํ•ฉ๋‹ˆ๋‹ค.

์„œ๋ฒ„๋ฅผ ์‹œ์ž‘ํ•˜๋Š” js ํŒŒ์ผ์˜ ๋งจ ์•„๋ž˜์— ๋‹ค์Œ์„ ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค.
process.on('SIGINT', () => { console.log("Bye bye!"); process.exit(); })

์ฒœ๋งŒ์—์š”!

๋„์›€์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค! ๊ฐ์‚ฌ ํ•ด์š”!

๋ฐ๋น„์•ˆ ๊ธฐ๋ฐ˜ ๋ฐฐํฌํŒ์—์„œ ๋‚ด js ํŒŒ์ผ ๋์— process.on('SIGINT', () => { console.log("Bye bye!"); process.exit(); }) ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  ๊ทธ ์ด์œ ๋ฅผ 100% ํ™•์‹ ํ•  ์ˆ˜๋Š” ์—†์ง€๋งŒ kill ๋ช…๋ น์„ ํฌํ•จํ•˜๋„๋ก ์‹œ์ž‘ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํŽธ์ง‘ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋‚˜์™€ ๊ฐ™์€ ๊ฐœ๋ฐœ์„ ์œ„ํ•ด mac/*nix๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ž‘๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

"scripts": {
    "start": "npm run kill & node ./node_modules/.bin/nodemon ./bin/www",
    "kill": "kill $(lsof -t -i:3000) | exit 0",
}

3000์€ ์‚ฌ์šฉ์ค‘์ธ ํฌํŠธ์ž…๋‹ˆ๋‹ค. | exit 0 ํฌํŠธ๊ฐ€ ์‚ฌ์šฉ ์ค‘์ด ์•„๋‹Œ ๊ฒฝ์šฐ ์˜ค๋ฅ˜๋ฅผ ๋ฌต์Œ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์‹œ์ž‘ ๋ช…๋ น์€ ์ด์ œ npm run kill & ๋กœ ์ข…๋ฃŒ๋˜๊ณ  ๋Œ€๊ธฐํ•˜๋ฉฐ node ./node_modules/.bin/nodemon ./bin/www ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์•ฑ์„ ์‹œ์ž‘ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ „์—์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ ์ ์ด ์—†์ง€๋งŒ ๊ฐ‘์ž๊ธฐ ์ง€๊ธˆ ๋ฐœ์ƒํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ถ„ํˆฌ 18.04 "nodemon": "^2.0.2" , ๋…ธ๋“œ ๋ฒ„์ „ 13.7.0 .

๋‚˜๋Š” ์ „์—์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ ์ ์ด ์—†์ง€๋งŒ ๊ฐ‘์ž๊ธฐ ์ง€๊ธˆ ๋ฐœ์ƒํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ถ„ํˆฌ 18.04 "nodemon": "^2.0.2" , ๋…ธ๋“œ ๋ฒ„์ „ 13.7.0 .

๋‘ ๋„๊ตฌ ๋ฒ„์ „ ๋ชจ๋‘ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋Š” ์ˆ˜๋งŽ์€ ์›์ธ์—์„œ ์ฃผ๊ธฐ์ ์œผ๋กœ ๋‚˜ํƒ€๋‚˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด ์Šค๋ ˆ๋“œ๊ฐ€ ์ตœ๊ณ ์˜ ์ •๋ณด์›์ธ ๊ฒƒ ๊ฐ™์•„์„œ ๋‹ค์‹œ ์—ด์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ž ๊น๋งŒ์š”, ํ”„๋กœ์„ธ์Šค๋ฅผ ์ข…๋ฃŒํ•œ ํ›„์—๋„ nodemon์€ ๊ณ„์† ์‹คํ–‰ ์ค‘์ž…๋‹ˆ๋‹ค! ์„œ๋ฒ„ ํŒŒ์ผ์„ ์ˆ˜์ •ํ•˜๊ณ  ๋ณด๋‹ˆ ๊ฐ‘์ž๊ธฐ pid๊ฐ€ ๋‹ค์‹œ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” nodemon์„ ๋™์‹œ์— ์‹คํ–‰ํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์ฐจ์ด๊ฐ€ ์žˆ๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ง€๋‚œ ์ฃผ์— ์ƒˆ๋กœ์šด Hapi ํ”„๋กœ์ ํŠธ์—์„œ ๊ทธ ๋ฌธ์ œ๋ฅผ ๊ฒฝํ—˜ํ–ˆ์Šต๋‹ˆ๋‹ค. 5๋ฒˆ ์ค‘ 4๋ฒˆ, nodemon์ด ๋‹ค์‹œ ๋กœ๋“œ๋  ๋•Œ EADDRINUSE ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ด์ „ ๋ฒ„์ „์˜ Hapi์™€ ๋™์ผํ•œ ๋ฒ„์ „์˜ nodemon( 2.0.2 )์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด์ „ ํ”„๋กœ์ ํŠธ๋กœ ์ž‘์—…ํ•  ๋•Œ ํ•ด๋‹น ์˜ค๋ฅ˜๋ฅผ ์žฌํ˜„ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค . ์ƒˆ ํ”„๋กœ์ ํŠธ์™€ ๋™์ผํ•œ Hapi ๋ฐ nodemon ๋ฒ„์ „์œผ๋กœ ์ฒ˜์Œ๋ถ€ํ„ฐ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ๋„ ์žฌํ˜„ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์›์ธ์„ ์กฐ์‚ฌํ•ด ๋ณด๊ฒ ์ง€๋งŒ ํ•˜ํ”ผ๋‚˜ ๋…ธ๋“œ๋ชฌ ์ž์ฒด๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ „์—์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ ์ ์ด ์—†์ง€๋งŒ ๊ฐ‘์ž๊ธฐ ์ง€๊ธˆ ๋ฐœ์ƒํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ถ„ํˆฌ 18.04 "nodemon": "^2.0.2" , ๋…ธ๋“œ ๋ฒ„์ „ 13.7.0 .

๋‘ ๋„๊ตฌ ๋ฒ„์ „ ๋ชจ๋‘ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋Š” ์ˆ˜๋งŽ์€ ์›์ธ์—์„œ ์ฃผ๊ธฐ์ ์œผ๋กœ ๋‚˜ํƒ€๋‚˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด ์Šค๋ ˆ๋“œ๊ฐ€ ์ตœ๊ณ ์˜ ์ •๋ณด์›์ธ ๊ฒƒ ๊ฐ™์•„์„œ ๋‹ค์‹œ ์—ด์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ, @Ratstail91 ๊ณผ ํ•จ๊ป˜ - ๋‹ค์‹œ ์—ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”,

์˜ค๋Š˜๋ถ€ํ„ฐ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.
ts-node์™€ ํ•จ๊ป˜ nodemon์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค(typescript๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ๋ฐœํ•œ ํ”„๋กœ์ ํŠธ)

๋‚˜๋Š” ์•„๋ž˜์˜ ๋ชจ๋“  ๊ฒƒ์„ ์‹œ๋„ํ–ˆ์ง€๋งŒ ์•„๋ฌด ๊ฒƒ๋„ ์ž‘๋™ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

  1. node_modules ์žฌ์„ค์น˜
  2. ๋…ธ๋“œ ๋ฒ„์ „์„ 10์—์„œ 12 ๋ฐ 13์œผ๋กœ ์ „ํ™˜ํ•˜๊ณ  ์•ŒํŒŒ์ธ ํƒœ๊ทธ๋„ ์ „ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  3. nodemon 2.0.2์—์„œ 1.19๋กœ ์ „ํ™˜
  4. ๋„์ปค ๋ณผ๋ฅจ, ๋„คํŠธ์›Œํฌ, ์ปจํ…Œ์ด๋„ˆ, ์ด๋ฏธ์ง€ ์ •๋ฆฌ
  5. ์ด๋ฏธ์ง€๋ฅผ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋‹ค์‹œ ๋นŒ๋“œํ•ฉ๋‹ˆ๋‹ค.
  6. ๋ชจ๋“  ์ข…๋ฅ˜์˜ ๊ธฐ์ˆ (lsof, pkill, kill, killall ...
  7. ํฌํŠธ๋ฅผ 3000์—์„œ ๋‹ค๋ฅธ ํฌํŠธ๋กœ ๋ณ€๊ฒฝ
  8. ํ˜ธ์ŠคํŠธ๋ฅผ 0.0.0.0์—์„œ ๋‹ค๋ฅธ ํ˜ธ์ŠคํŠธ๋กœ ๋ณ€๊ฒฝ
  9. ๋‚ด ์ปดํ“จํ„ฐ ๋‹ค์‹œ ์‹œ์ž‘(๋งˆ์ง€๋ง‰ ์†”๋ฃจ์…˜ ์ƒํ™ฉ)

์›ƒ๊ธด๊ฑด ์ œ๊ฐ€ ์–ด์ œ nodemon์„ ์—…๋ฐ์ดํŠธ ํ–ˆ๋‹ค๋Š”๊ฑฐ...
๋„ˆํฌ๋“ค์—๊ฒŒ ํ•ด๊ฒฐ์ฑ…์ด ์žˆ๋‹ค๋ฉด ๋‚˜๋Š” ์—ฌ์ „ํžˆ ์—ฌ๊ธฐ ์žˆ๋‹ค.

๋ฉ”์‹œ์ง€ ์˜ค๋ฅ˜๋Š” =>

yume-api | Error: listen EADDRINUSE: address already in use "3000" yume-api | at Server.setupListenHandle [as _listen2] (net.js:1263:19) yume-api | at listenInCluster (net.js:1328:12) yume-api | at Server.listen (net.js:1426:5) yume-api | at Function.listen (/usr/src/yume-api/node_modules/express/lib/application.js:618:24) yume-api | at Object.<anonymous> (/usr/src/yume-api/src/server.ts:35:5) yume-api | at Module._compile (internal/modules/cjs/loader.js:778:30) yume-api | at Module.m._compile (/usr/src/yume-api/node_modules/ts-node/src/index.ts:814:23) yume-api | at Module._extensions..js (internal/modules/cjs/loader.js:789:10) yume-api | at Object.require.extensions.(anonymous function) [as .ts] (/usr/src/yume-api/node_modules/ts-node/src/index.ts:817:12) yume-api | at Module.load (internal/modules/cjs/loader.js:653:32) yume-api | at tryModuleLoad (internal/modules/cjs/loader.js:593:12) yume-api | at Function.Module._load (internal/modules/cjs/loader.js:585:3) yume-api | at Function.Module.runMain (internal/modules/cjs/loader.js:831:12) yume-api | at main (/usr/src/yume-api/node_modules/ts-node/src/bin.ts:226:14) yume-api | at Object.<anonymous> (/usr/src/yume-api/node_modules/ts-node/src/bin.ts:485:3) yume-api | at Module._compile (internal/modules/cjs/loader.js:778:30) yume-api | at Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10) yume-api | at Module.load (internal/modules/cjs/loader.js:653:32) yume-api | at tryModuleLoad (internal/modules/cjs/loader.js:593:12) yume-api | at Function.Module._load (internal/modules/cjs/loader.js:585:3) yume-api | at Function.Module.runMain (internal/modules/cjs/loader.js:831:12) yume-api | at startup (internal/bootstrap/node.js:283:19) yume-api | [nodemon] app crashed - waiting for file changes before starting...

๊ทธ๊ฑด ๊ทธ๋ ‡๊ณ , ํ”„๋กœ์ ํŠธ ๋””๋ ‰ํ† ๋ฆฌ์— ์ƒ์„ฑ๋œ ์ด์ƒํ•œ ์†Œ์ผ“ ํŒŒ์ผ "3000"์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ „์—์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ ์ ์ด ์—†์ง€๋งŒ ๊ฐ‘์ž๊ธฐ ์ง€๊ธˆ ๋ฐœ์ƒํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ถ„ํˆฌ 18.04 "nodemon": "^2.0.2" , ๋…ธ๋“œ ๋ฒ„์ „ 13.7.0 .

๋‘ ๋„๊ตฌ ๋ฒ„์ „ ๋ชจ๋‘ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋Š” ์ˆ˜๋งŽ์€ ์›์ธ์—์„œ ์ฃผ๊ธฐ์ ์œผ๋กœ ๋‚˜ํƒ€๋‚˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด ์Šค๋ ˆ๋“œ๊ฐ€ ์ตœ๊ณ ์˜ ์ •๋ณด์›์ธ ๊ฒƒ ๊ฐ™์•„์„œ ๋‹ค์‹œ ์—ด์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ node from Docker Official Images ์—์„œ ์ด ๋ฌธ์ œ์— ์ง๋ฉดํ–ˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ Mac OS ์—์„œ ์‹คํ–‰๋˜๋Š” ๋„์ปค ์ปจํ…Œ์ด๋„ˆ๋งŒ Windows 10 ํ˜ธ์ŠคํŠธ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋˜ํ•œ ๊ฐ™์€ ๋ฌธ์ œ์— ์ง๋ฉดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ๋ฅผ ์ž‘๋™์‹œํ‚ค๋ ค๋ฉด 3/4๋ฒˆ ์—ฐ์†์œผ๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ์ €์žฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ์ž ๊ทธ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. 3๋…„ ๋œ ์ฝ”๋“œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ–ˆ์œผ๋ฉฐ ๋ณ‘ํ•ฉ์ด ์žˆ์—ˆ๊ณ  ๋ฌธ์ œ์˜ ์›์ธ์„ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋” ์ตœ๊ทผ์— ๊ฒŒ์‹œํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์€ ๋น„์Šทํ•œ ์ฆ์ƒ์„ ๊ฒช๊ณ  ์žˆ์ง€๋งŒ ๋™์ผํ•œ ์ถœ์ฒ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค(๋˜ํ•œ ๋ณต์ œํ•  ์ •๋ณด๊ฐ€ ์ „ํ˜€ ์—†์Œ).

์ด๋Ÿฌํ•œ _new_ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ํ™๋ณด๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ์‚ฌ ํ•ด์š”.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰