How to package and distribute your apps - composite/nw.js GitHub Wiki

๋น ๋ฅธ ๋ฐฐํฌ

๊ทธ๋ƒฅ nw ์‹คํ–‰ ํŒŒ์ผ๊ณผ .nw ํ™•์žฅ์ž๋ฅผ ๊ฐ€์ง„ ์••์ถ• ํŒŒ์ผ์„ ๊ฐ™์€ ํด๋” ๋‚ด์— ๋ฐฐ์น˜ํ•œ ๋‹ค์Œ ๋ฐฐํฌํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๋‹จ, ๋งฅ์€ ํ‹€๋ฆฝ๋‹ˆ๋‹ค. ๋ฐฐํฌํ•  .nw ์•ฑ์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋„ฃ๊ณ  ์ด๋Ÿฐ ๊ฒฝ๋กœ๋กœ ๋ฐฐ์น˜ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. nwjs.app/Contents/Resources/app.nw

๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ํŒจํ‚ค์ง€๋ฅผ ๋งŒ๋“ค๋ ค๋ฉด ์•„๋ž˜๋ฅผ ์ฝ์œผ์„ธ์š”.

์ถ”๊ฐ€ ํŒŒ์ผ ์ค€๋น„

The following sub-directories can be put in application's root directory: ๋‹ค์Œ ํ•˜์œ„ ํด๋”๋ฅผ ์•ฑ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์ฒจ๋ถ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • node_modules - ๋‹น์‹ ์˜ ์•ฑ์— ์‚ฌ์šฉํ•  node.js ๋ชจ๋“ˆ ํด๋”
  • plugins - NPAPI ํ”Œ๋Ÿฌ๊ทธ์ธ๋“ค

nwjc ๋Š” ๋”ฐ๋กœ ๋ฐฐํฌํ•  ํ•„์š” ์—†์Šต๋‹ˆ๋‹ค.

์ฃผ์˜์‚ฌํ•ญ: node_module ์— ๋“ค์–ด๊ฐ„ node.js ๋ชจ๋“ˆ์ด ์ง€์›ํ•˜๋Š” ํ”Œ๋žซํผ์„ ๋ฐ˜๋“œ์‹œ ์ฒดํฌํ•˜์„ธ์š”. ์˜ˆ๋ฅผ ๋“ค๋ฉด, node-email-templates ๋ฅผ ์œˆ๋„์šฐ๋‚˜ ๋งฅ์—์„œ npm install ์„ ํ†ตํ•ด ์„ค์น˜ํ–ˆ๋‹ค๋ฉด, ํŒŒ์ด์ฌ์ด ํ•ด๋‹น ํ”Œ๋žซํผ์— ์„ค์น˜๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ด์ฌ์€ ์œˆ๋„์šฐ์— ๊ธฐ๋ณธ ์„ค์น˜๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ๋„ค์ดํ‹ฐ๋ธŒ ๋ชจ๋“ˆ์ด ๋“ค์–ด๊ฐ„ ๊ฒฝ์šฐ (์˜ˆ:socket.io)๋Š” ๊ฐ ํ”Œ๋žซํผ๋ณ„๋กœ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

npm install ์„ ํ†ตํ•ด ์„ค์น˜ํ•˜๊ณ  ์ •์˜ํ•œ package.json ํŒŒ์ผ์—์„œ ์ •ํ•ด์ง„ ํ”Œ๋žซํผ์„ ํ™•์ธํ•˜๊ณ  ์ •ํ™•ํ•˜๊ฒŒ ๋Œ์•„๊ฐ€๋Š” ์ง€ ํ™•์ธํ•  ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ณผ์ • 1: ํŒจํ‚ค์ง€ ๋งŒ๋“ค๊ธฐ

ํŒจํ‚ค์ง€ ์‹œ์Šคํ…œ์€ Lร–VE ์™€ ๋น„์Šทํ•œ ๋ฐฉ๋ฒ•์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. ํ•ด๋‹น Wiki ์— ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ด ์•ฑ์— ๋งž์ถฐ ๊ฐ€์ด๋“œ๋ฅผ ์ œ์‹œํ•ฉ๋‹ˆ๋‹ค.

์•ฑ์„ ํŒจํ‚ค์ง€ํ•˜๊ธฐ ์œ„ํ•ด .nw ํŒŒ์ผ๋กœ zip ์••์ถ• ์‹œ ๋‹ค์Œ 3๊ฐ€์ง€ ์‚ฌํ•ญ์ด ์ง€์ผœ์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ๋ฐ˜๋“œ์‹œ package.json ํŒŒ์ผ์ด ์žˆ๊ณ  ์ •์˜๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋งค๋‹ˆํŽ˜์ŠคํŠธ ํ˜•์‹์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.
  • package.json ํŒŒ์ผ์€ ๋ฐ˜๋“œ์‹œ ์•ฑ ์ตœ์ƒ์œ„ ํด๋”์— ์œ„์น˜๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ํŒŒ์ผ ์† ๋ชจ๋“  ํŒŒ์ผ ๋ฐ ํด๋”๋Š” ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์œˆ๋„์šฐ ์ด์šฉ์ž์—๊ฒŒ๋Š” ํ•ด๋‹น์‚ฌํ•ญ์ด ์—†์œผ๋‚˜, ๋งฅ ๋˜๋Š” ๋ฆฌ๋ˆ…์Šค๋Š” ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์•ฑ ์•ˆ์—์„œ ์ง€์ •๋œ ๊ฒฝ๋กœ๊ฐ€ ์ •ํ™•ํ•˜๊ฒŒ ์œ„์น˜ํ•˜๊ณ  ๊ฐ€๋ฆฌํ‚ค๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ ์ด๋ ‡๊ฒŒ ๋งŒ๋“ค์–ด์ง„ .nw ํŒŒ์ผ์„ ์‹คํ–‰ ํŒŒ์ผ๋กœ ๋งŒ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์œˆ๋„์šฐ์ฆˆ

  1. zip ํŒŒ์ผ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. (์œˆ๋„์šฐ XP ์ด์ƒ์€ ๋‚ด์žฅ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.)
  2. ์•ฑ์— ํ•„์š”ํ•œ ๋ชจ๋“  ํŒŒ์ผ์„ zip ํŒŒ์ผ ์†์— ๋„ฃ๊ณ , ํŠนํžˆ package.json ํŒŒ์ผ์€ ์•ฑ์˜ ์ตœ์ƒ์œ„ ํด๋”์— ์œ„์น˜ํ–ˆ๋Š”์ง€ ํ™•์ธํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์„๊ฒฝ์šฐ ์•ฑ์ด ๋™์ž‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  3. zip ํŒŒ์ผ์„ .nw ํ™•์žฅ์ž๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. ์ปดํ“จํ„ฐ์— ๋”ฐ๋ผ zip ํŒŒ์ผ ํ™•์žฅ์ž๊ฐ€ ์ˆจ๊ฒจ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ์—๋Š” ํด๋” ์˜ต์…˜์— "๋ณด๊ธฐ" ํƒญ์— "์•Œ๋ ค์ง„ ํŒŒ์ผ ํ˜•์‹์˜ ํ™•์žฅ์ž ์ˆจ๊ธฐ๊ธฐ" ๋ฅผ ์ฒดํฌ ํ•ด์ œํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๋ฆฌ๋ˆ…์Šค ๋ฐ ๋งฅ

ํ„ฐ๋ฏธ๋„์„ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค.

  1. ์•ฑ ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. cd ~/Projects/my_app
  2. ์••์ถ• ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. zip -r ../${PWD##*/}.nw *
  3. ์••์ถ•ํ•œ .nw ํ™•์žฅ์ž๋ฅผ ๊ฐ€์ง„ ํŒŒ์ผ์„ ๋ณ„๋„์˜ ํด๋”๋กœ ๋„์ง‘์–ด ๋ƒ…๋‹ˆ๋‹ค.
  4. ์ฐธ ์‰ฝ์ฃ ?

๊ณผ์ • 2a: nw ์‹คํ–‰ ํŒŒ์ผ๊ณผ ๊ฐ™์ด ์•ฑ ํŒŒ์ผ ๋†“๊ธฐ

  • package.nw ํŒŒ์ผ๋กœ ๋ณ€๊ฒฝํ•œ ๋‹ค์Œ nw ์‹คํ–‰ ํŒŒ์ผ๊ณผ ๊ฐ™์€ ๊ณณ์— ์˜ฎ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์•„๋‹ˆ๋ฉด ์‹คํ–‰ ํŒŒ์ผ์ด ์žˆ๋Š” ํด๋”์— ๊ทธ๋ƒฅ package.json ํŒŒ์ผ์„ ๋„ฃ๊ณ  ๊ทธ ๊ธฐ์ค€์œผ๋กœ ์•ฑ์„ ํ†ต์งธ๋กœ ์œ„์น˜์‹œํ‚ฌ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ nw ์‹คํ–‰ ํŒŒ์ผ์€ ๊ทธ๋ƒฅ ์‹คํ–‰ ์‹œ ๊ฐ™์€ ํด๋” ๋‚ด์— ์žˆ๋Š” package.json ์„ ๋จผ์ € ์ฐพ์Šต๋‹ˆ๋‹ค.(๋งฅ์—์„œ๋Š” node-webkit.app ํŒจํ‚ค์ง€ ์•ˆ์— ์žˆ๋Š” ์ตœ์ƒ์œ„ ํด๋” ๋„ฃ์–ด๋„ ๊ฐ™์€ ํšจ๊ณผ์ž…๋‹ˆ๋‹ค.) ์ด๋Ÿฐ ๋ฐฉ๋ฒ•์€ ์•ฑ์˜ ํฌ๊ธฐ๊ฐ€ ๋„ˆ๋ฌด ํด ๋•Œ ์ถ”์ฒœํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.
  • nodebob ์„ ํ†ตํ•ด ์œˆ๋„์šฐ ํ™˜๊ฒฝ์—์„œ nw.js ์•ฑ ๋นŒ๋“œ๋ฅผ ์ž๋™ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ๋ฒ„์ „์€ 0.1 ์ด๋ฉฐ, ์œˆ๋„์šฐ ๋ฐฐ์น˜ ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋ฐ˜์ž…๋‹ˆ๋‹ค.
  • node-webkit-builder & grunt-node-webkit-builder ๊ฐ™์€ nw.js ๋นŒ๋“œ ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜์—ฌ grunt ๋ฅผ ํ†ตํ•ด ํฌ๋กœ์Šค ํ”Œ๋žซํผ์œผ๋กœ ์•ฑ์„ ๋ฐฐํฌํ•˜๋Š” ๊ณผ์ •์„ ์ž๋™ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ชจ๋“ˆ์€ ์ž๋™์œผ๋กœ ๋นŒ๋“œ๋œ nw.js ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ๋จผ์ € ๋ฐ›์€ ํ›„, ์••์ถ•์„ ํ’€์–ด ๋ฐฐํฌํ•  ํด๋”์— ์••์ถ•์„ ํ‘ผ ํ›„, ์•ฑ ํด๋”๋ฅผ app.nw ์œผ๋กœ ์ž๋™ ์••์ถ•์„ ๊ฑธ์–ด ๋ฐฐํฌํ•  ํด๋”์— ์‹คํ–‰ ํŒŒ์ผ๊ณผ ๊ฐ™์ด ๋ฐฐ์น˜ํ•˜๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • Nuwk! Nuwk! ๋ชจ๋“ˆ์€ ๋งฅ์—์„œ nw.js ์•ฑ์„ ๋นŒ๋“œํ•˜๋Š” nw.js ๊ธฐ๋ฐ˜์˜ ์†์‰ฌ์šด ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ์™€ ๋นŒ๋“œ ๊ณผ์ •์„ ๋‹จ์ˆœํ™”ํ•˜๊ณ , ์‹คํ–‰ ํŒจํ‚ค์ง€๋ฅผ ๋งŒ๋“ค๊ณ , ์•„์ด์ฝ˜์„ ์ฒจ๋ถ€ํ•˜์—ฌ ์•ฑ์„ ๋ฐฐํฌํ•˜๋Š” ๊ณผ์ •์„ ๋„์™€์ค„ ๊ฒ๋‹ˆ๋‹ค. (์•„์ง ์•ŒํŒŒ ๋‹จ๊ณ„์ž…๋‹ˆ๋‹ค.)
  • generator-node-webkit ๋ชจ๋“ˆ์€ yeoman ์„ ์ด์šฉํ•˜์—ฌ ํฌ๋กœ์Šค ํ”Œ๋žซํผ์œผ๋กœ ํŒจํ‚ค์ง•์„ ๋„์™€์ฃผ๋Š” ๋ชจ๋“ˆ์ž…๋‹ˆ๋‹ค.
  • lein-node-webkit-builder ๋ชจ๋“ˆ์€ grunt-node-webkit-builder ๋ชจ๋“ˆ๊ณผ ๋น„์Šทํ•˜์ง€๋งŒ, nw.js ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ์ž๋™์œผ๋กœ ๋‹ค์šด๋ฐ›๊ณ , ๋ฉ€ํ‹ฐ ํ”Œ๋žซํผ์œผ๋กœ ๋นŒ๋“œํ•˜๋Š” ๊ณผ์ •์„ ๋„์™€์ค„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋Š” Leiningen ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ํ•„์š”ํ•˜๋ฉฐ, ClojureScript ๋ฅผ ์ด์šฉํ•œ ์Šคํฌ๋ฆฝํŒ…์— ์ตœ์ ํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • Web2Executable ํ”„๋กœ๊ทธ๋žจ์€ ํฌ๋กœ์Šค ํ”Œ๋žซํผ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” ์˜คํ”ˆ์†Œ์Šค GUI ์•ฑ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €์ž…๋‹ˆ๋‹ค. ์›น ์•ฑ์„ ๋‹จ์ผ ํŒŒ์ผ๋กœ ๋งŒ๋“ค์–ด ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๊ณ , ๋‹จ์ˆœํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งฅ๊ณผ ๋ฆฌ๋ˆ…์Šค๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋™์ž‘ํ•˜์ง€๋งŒ ์œˆ๋„์šฐ๋Š” Pyside๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์•„์ง์€ ๋ฒ ํƒ€์ด๊ธฐ ๋•Œ๋ฌธ์— ์ฐธ์—ฌ์™€ ํ”ผ๋“œ๋ฐฑ์„ ์—ด๋ ฌํžˆ ํ™˜์˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
  • nwjs-shell-builder - nwjs ์‰˜ ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋ฐ˜ ๋นŒ๋“œ ํˆด์ž…๋‹ˆ๋‹ค. ์ด ์Šคํฌ๋ฆฝํŠธ๋Š” ๋นŒ๋“œ ๊ณผ์ •์„ ์ƒ์„ฑํ•˜๊ณ , ๊ฐ ํ”Œ๋žซํผ๋ณ„ nw.js ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ์†Œ์Šค ํด๋”์— ๋‹ค์šด๋ฐ›์•„ ํฌ๋กœ์Šค ํ”Œ๋žซํผ ๋ฐฐํฌ๋ฅผ ๋„์™€์ค๋‹ˆ๋‹ค.

๊ณผ์ • 2b: ๋˜๋‹ค๋ฅธ ๋ฐฉ๋ฒ• - .nw ํŒŒ์ผ ์™ธ์˜ ๋ฐฉ๋ฒ•์œผ๋กœ ์‹คํ–‰ ํŒŒ์ผ ๋งŒ๋“ค๊ธฐ

๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์ตœ์ข… ์‚ฌ์šฉ์ž์—๊ฒŒ ์•ฑ์„ ์‰ฝ๊ฒŒ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ์ง‘์ค‘ํ•˜๊ณ  ์žˆ์„ ๊ฒ๋‹ˆ๋‹ค. ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž์—๊ฒŒ .nw ํŒŒ์ผ๋งŒ ๋”ธ๋ž‘ ๋˜์ง€๋ฉด ์•„๋ฌด๋ž˜๋„ ์‚ฌ์šฉ์ž์—๊ฒ nw.js ๋Ÿฐํƒ€์ž„์ด ์••์ถ• ํ‘ผ ์ƒํƒœ๋กœ ํ•„์š”ํ•˜๊ฒ ์ฃ . ํ•˜์ง€๋งŒ nw.js ํŒŒ์ผ์— ์•ฑ .nw ํŒŒ์ผ์„ ํ•ฉ์ณ์„œ ์‹คํ–‰ ํŒŒ์ผ์„ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ .nw ํŒŒ์ผ์„ ์ œ๊ณตํ•˜๊ณ , ์„ ํƒ์‚ฌํ•ญ์œผ๋กœ ํ•ฉ์ณ์ง„ ์‹คํ–‰ ํŒŒ์ผ์„ ๊ฐ ํ”Œ๋žซํผ์— ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ๊ฐ„ํŽธํ•ฉ๋‹ˆ๋‹ค.

์•„๋ž˜ ๋‘๊ฐ€์ง€ ์‚ฌํ•ญ์„ ๋ฐ˜๋“œ์‹œ ์ฒดํฌํ•˜์„ธ์š”.

  • ์ตœ์ข… ์‹คํ–‰ ํŒŒ์ผ์€ ๋‹จ์ผ ์‹คํ–‰ ํŒŒ์ผ์ด ๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋“œ์‹œ ํ•จ๊ป˜ ์žˆ๋Š” DLL ํŒŒ์ผ์„ ๊ฐ™์ด ๋ฐฐํฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ํ•ฉ์ณ์ง„๋‹ค ํ•ด๋„ ์—ฌ์ „ํžˆ ์•ฑ ๋‚ด์šฉ์„ WinZip ๊ฐ™์€ ์••์ถ• ๊ด€๋ฆฌ ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์œˆ๋„์šฐ์ฆˆ

์œˆ๋„์šฐ ๋ช…๋ น ํ”„๋กฌํ”„ํŠธ์—์„œ ์ด ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค:

copy /b nw.exe+app.nw app.exe 

๊ทธ๋ฆฌ๊ณ  app.exe ๊ณผ ํ•„์š”ํ•œ DLL ํŒŒ์ผ์„ ์••์ถ•ํ•˜์—ฌ ๋ฐฐํฌํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด nw.js ์˜ ๋…์ž”์  ๋ฐฐํฌ๊ฐ€ ๋˜๊ฒ ์ฃ . ํ•˜์ง€๋งŒ ๊ทธ๊ฑด ์ƒ๊ด€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•œ๋‹ค๋Š” ๊ฒƒ์€ ๊ฐ ํ”Œ๋žซํผ์— ํ•˜๋‚˜์˜ ํŒจํ‚ค์ง€๋ฅผ ๋ฐฐํฌํ•˜๊ฑฐ๋‚˜, ๊ฐ„๋‹จํ•˜๊ฒŒ .nw ํŒŒ์ผ๋งŒ ๋”ธ๋ž‘ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์œผ๋‹ˆ๊นŒ์š”.

๊ทธ๋ฆฌ๊ณ  ๋ฐ˜๋“œ์‹œ nw.pak ํŒŒ์ผ์ด app.exe ํŒŒ์ผ๊ณผ ๊ฐ™์ด ๋ฐฐํฌ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ค‘์š” ์‚ฌํ•ญ: ๋งŒ์•ฝ ๋„ค์ดํ‹ฐ๋ธŒ ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๋ฐฐํฌํ•œ .exe ํŒŒ์ผ์ด ๋ฐ˜๋“œ์‹œ nw.exe ํŒŒ์ผ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” node.js ๋ชจ๋“ˆ ์‚ฌ์šฉ์— ๊ธฐ์žฌ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ์‚ฌํ•ญ์€ ์ด์Šˆ #199 ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

๋ฆฌ๋ˆ…์Šค

๋ฆฌ๋ˆ…์Šค๋„ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.

cat /usr/bin/nw app.nw > app && chmod +x app 

์ด๋ ‡๊ฒŒ ํ–ˆ์œผ๋ฉด ์ด์ œ ์ข…์†์„ฑ์„ ํฌํ•จํ•˜์—ฌ ํŒจํ‚ค์ง•์„ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. .deb ํŒจํ‚ค์ง€๋ฅผ ๋งŒ๋“ ๋‹ค๋ฉด ์‚ฌ์šฉ์ž๋“ค์€ ๊ตณ์ด nw.js ๋ฅผ ๋”ฐ๋กœ ์„ค์น˜ํ•  ํ•„์š”๊ฐ€ ์—†๊ฒ ์ฃ .

ํ•œ๊ฐ€์ง€ ์žŠ์ง€ ๋ง์•„์•ผ ํ•  ์‚ฌ์‹ค์€ nw.pak ํŒŒ์ผ์ด ์•ฑ ํด๋” ์ตœ์ƒ์œ„์— ์žˆ์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•ˆ๊ทธ๋Ÿฌ๋ฉด ์ผ๋ถ€ ๋นˆ ํŽ˜์ด์ง€๊ฐ€ ์‚ฌ์šฉ์ž๋“ค์„ ๋ฐ˜๊ฒจ์ค„ ๊ฒ๋‹ˆ๋‹ค.

๊ฒฐ๊ตญ ํŒจํ‚ค์ง€ ๋งŒ๋“ค๊ธฐ๋ฅผ ์ž๋™ํ™”ํ•  ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ œ๊ณตํ•ด์•ผ ๊ฒ ๊ตฐ์š”. ์ด๋Š” ์ง์ ‘ ํ•ด๊ฒฐํ•ด์•ผ ํ•  ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

๋งคํ‚จํ† ์‹œ

์ด ๊ฐ€์ด๋“œ๋Š” node-webkit 0.2.4 ์ด์ƒ ๊ธฐ์ค€์ž…๋‹ˆ๋‹ค.

๋งฅ์—์„œ๋Š” node-webkit.app ์ด ํด๋”๋ผ ์‰ฝ๊ฒŒ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. nw.js ๊ฐ€ ์ž๋™์œผ๋กœ ๋‹น์‹ ์˜ ์•ฑ์„ ์‹คํ–‰์‹œํ‚ค๋ ค๋ฉด ์•ฑ ์••์ถ• ํŒŒ์ผ์„ Contents/Resources ์— ๋„ฃ๊ณ  ํŒŒ์ผ๋ช…์„ app.nw ๋ผ๊ณ  ๋ช…๋ช…ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์‹œ์ž‘ ์†๋„๋ฅผ ๊ฐœ์„ ํ•˜๊ณ ์ž ํ•œ๋‹ค๋ฉด ๊ตณ์ด ์••์ถ•ํ•˜์ง€ ์•Š๊ณ  ๋„ฃ์–ด๋„ ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ด์ œ ์‹ค์ œ ๋ฐฐํฌ๋ณธ์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ์•„๋ž˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • Contents/Resources/nw.icns: ์•ฑ ์•„์ด์ฝ˜ ์ •์˜
  • Contents/Info.plist: ์• ํ”Œ ํŒจํ‚ค์ง€ ์ •์˜ ํŒŒ์ผ

Info.plist ํŒŒ์ผ์— ๋Œ€ํ•ด์„œ๋Š” ํŒจ๋„์— ๋Œ€ํ•œ Cocoa ํ‘œ์ค€ ๊ตฌํ˜„ on how ๋งํฌ๋ฅผ ์ฐธ์กฐํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ์•ฑ ์ •๋ณด๋ฅผ ์ •์˜ํ•˜๊ธฐ ์œ„ํ•ด ์ˆ˜์ •ํ•ด์•ผ ํ•˜๋Š”์ง€ ๊ธฐ์žฌ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. (์ฃผ: ๋งฅ์„ ๋ชฐ๋ผ ๋ฒˆ์—ญ์ด ์ด์ƒํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•œ๊ธ€ ์„ค๋ช… ์žˆ์œผ๋ฉด ๋งํฌ ์ˆ˜์ •ํ•ด์ฃผ์„ธ์š”.)

๋ฐ˜๋“œ์‹œ ํ•„์š”ํ•œ ํŒŒ์ผ์€?

v0.10.0 ๋ถ€ํ„ฐ๋Š”, icudtl.dat ํŒŒ์ผ์ด ๋ชจ๋“  ํ”Œ๋žซํผ์— ํฌํ•จ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์‹  icudt.dll ํŒŒ์ผ์€ ํ•„์š”์—†๊ฒŒ ๋์Šต๋‹ˆ๋‹ค.

๊ทธ ์™ธ ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ๋“ค์€ ์„ ํƒ์ ์œผ๋กœ ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•  ๊ฒฝ์šฐ ๊ฐ™์ด ํฌํ•จ์‹œํ‚ค๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๊ฐ ํ”Œ๋žซํผ๋งˆ๋‹ค ํ•„์š”ํ•œ ํŒŒ์ผ๋“ค์„ ์ง€๊ธˆ๋ถ€ํ„ฐ ํ™•์ธํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

ํฌ๋กœ๋ฏธ์›€ ์—”์ง„ ๊ธฐ๋ฐ˜์ด๋‹ค ๋ณด๋‹ˆ ๋‹ค์ค‘ ์˜คํ”ˆ ์†Œ์Šค ๋ผ์ด์„ ์Šค ๋•Œ๋ฌธ์— (MIT/LGPL/BSD/Ms-PL ๋“ฑ๋“ฑ...) ํŒŒ์ผ์„ ๋”ฐ๋กœ ๋‘์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. (๊ทธ๋ ‡๋‹ค๊ณ  ๋‹น์‹ ์ด ๋งŒ๋“  ์•ฑ์˜ ์†Œ์Šค ์ฝ”๋“œ๊นŒ์ง€๋Š” ์˜ํ–ฅ๋ฐ›์ง€ ์•Š์Šต๋‹ˆ๋‹ค.)

์œˆ๋„์šฐ์ฆˆ

nw.pak ํŒŒ์ผ๊ณผ icudt.dll ํŒŒ์ผ์ด nw.exe ํŒŒ์ผ๊ณผ ๊ฐ™์€ ํด๋” ๋‚ด์— ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ค‘์š”ํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํŒŒ์ผ๋“ค์ด๋ฉฐ, ๋„คํŠธ์›Œํฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋„ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

ffmpegsumo.dll ํŒŒ์ผ์€ ๋ฏธ๋””์–ด๋ฅผ ๋‹ค๋ฃจ๋Š” ํŒŒ์ผ์ž…๋‹ˆ๋‹ค. <video> ํƒœ๊ทธ์™€ <audio> ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๋ฉด ์ด ํŒŒ์ผ์ด ํฌํ•จ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

libEGL.dll ํŒŒ์ผ๊ณผ libGLESv2.dll ํŒŒ์ผ์€ WebGL ๊ณผ GPU ๊ฐ€์†์„ ์œ„ํ•ด ํ•„์š”ํ•œ ํŒŒ์ผ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  D3DCompiler_43.dll ํŒŒ์ผ๊ณผ d3dx9_43.dll ํŒŒ์ผ์€ WebGL์„ ๋‹ค์–‘ํ•œ ํ•˜๋“œ์›จ์–ด์— ๋Œ๋ฆฌ๊ธฐ ์œ„ํ•ด ๋ฐ˜๋“œ์‹œ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” DirectX ์žฌ๋ฐฐํฌ ๋„๊ตฌ(redistributable) ์— ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฆฌ๋ˆ…์Šค

nw.pak ํŒŒ์ผ์€ ๋‹น์—ฐํžˆ nw ์‹คํ–‰ ํŒŒ์ผ๊ณผ ๊ฐ™์€ ํด๋”์— ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋น„๋””์˜ค์™€ ์˜ค๋””์˜ค๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋ฉด libffmpeg.so ํŒŒ์ผ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋งคํ‚จํ† ์‹œ

๊ทธ๋ƒฅ node-webkit.app ํŒจํ‚ค์ง€ ์•ˆ์— ํ•„์š”ํ•œ ํŒŒ์ผ์ด ๋ชจ๋‘ ๋“ค์–ด ์žˆ์œผ๋‹ˆ ๊ตณ์ด ์‹ ๊ฒฝ ์•ˆ ์จ๋„ ๋ฉ๋‹ˆ๋‹ค.

์œˆ๋„์šฐ์—์„œ ์‹คํ–‰ ํŒŒ์ผ์„ ๋งŒ๋“œ๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•

์œ„ ๋ฐฉ์‹๋Œ€๋กœ nw.exe ํŒŒ์ผ๊ณผ app.nw ํŒŒ์ผ์ด ํ•ฉ์ณ์ง„๋‹ค ํ•ด๋„, ์—ฌ์ „ํžˆ nw.pak ํŒŒ์ผ๊ณผ *.dll ํŒŒ์ผ์€ ๋ณ„๋„๋กœ ๊ฐ™์ด ์žˆ์–ด์•ผ ์ตœ์ข… ์‚ฌ์šฉ์ž์—๊ฒŒ ๊ฐ€๋™์„ฑ์ด ๋ณด์žฅ๋ฉ๋‹ˆ๋‹ค.

Enigma Virtual Box ๋ผ๋Š” ์†Œํ”„ํŠธ์›จ์–ด๋Š” ํŒŒ์ผ๊ณผ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋ฅผ ํ†ตํ•ฉํ•œ ๋‹จ์ผ ํŒŒ์ผ๋กœ ํŒจํ‚ค์ง€ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค๋‹ˆ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ ๊ฐœ์ธ ๋˜๋Š” ์ƒ์—…์  ๋ชฉ์ ์œผ๋กœ ๋ฌด๋ฃŒ ๋กœ ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฃผ์˜! "Enigma Virtual Box" ์†Œํ”„ํŠธ์›จ์–ด๋Š” ๋‹น์‹ ์˜ ์•ฑ์— ๋Œ€ํ•œ ์–ด๋– ํ•œ ์„ฑ๋Šฅ ๋ฐ ์•ˆ์ •์„ฑ์„ ๋ณด์ฆํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์„ ์“ธ ๊ฒฝ์šฐ์— ๋Œ€ํ•œ ์ฑ…์ž„์€ ์ œ์ž‘์ž ์ž์‹ ์—๊ฒŒ ์žˆ์Šต๋‹ˆ๋‹ค!

  1. ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๋‚ด๋ ค๋ฐ›๊ณ  ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.
  2. ์‹œ์ž‘ ๋ฉ”๋‰ด, ํ”„๋กœ๊ทธ๋žจ ํด๋”์— ์žˆ๋Š” 'Enigma Virtual Box' ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค..
  3. ๋ฐฐํฌ์šฉ์œผ๋กœ ๋งŒ๋“  app.exe ํŒŒ์ผ์„ ์‹คํ–‰ ํŒŒ์ผ๋กœ ์ง€์ •ํ•˜๊ณ  ๋ฉ”์ธ ํ”„๋กœ๊ทธ๋žจ์€ ๊ณต๋ž€์œผ๋กœ ๋‚จ๊ฒจ๋‘ก๋‹ˆ๋‹ค.
  4. ์‹คํ–‰ ํŒŒ์ผ๊ณผ ํ•จ๊ป˜ ์žˆ๋Š” *.dll ํŒŒ์ผ๊ณผ nw.pak ํŒŒ์ผ์„ ๋“œ๋ž˜๊ทธ ํ•˜๊ฑฐ๋‚˜ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. 'Select Folder' ๋ˆ„๋ฅผ ์‹œ ํด๋” ์„ ํƒ์ฐฝ์ด ๋‚˜์˜ค๋ฉด '%DEFAULT FOLDER' ๋ฅผ ์„ ํƒ ํ›„ 'OK' ๋ฒ„ํŠผ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
  5. ์••์ถ• ๊ธฐ๋Šฅ ์ด์šฉ ์‹œ 'File Options' ๋ฒ„ํŠผ์„ ํด๋ฆญ ํ›„, 'Compress Files'๋ฅผ ์„ ํƒํ•œ ๋‹ค์Œ, and 'OK' ๋ฒ„ํŠผ์„ ๋ˆ„๋ฆ…๋‹ˆ๋‹ค.
  6. ๋‚˜๋จธ์ง€ ๊ธฐ๋Šฅ ๋ฐ ์„ค์ •์„ ์ž์‹ ์— ๋งž๊ฒŒ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค..
  7. ๋ฉ”์ธ ํ™”๋ฉด์— ์žˆ๋Š” ์ปค๋‹ค๋ž€ 'Process' ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ ํŒจํ‚ค์ง€๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
  8. ๋ชจ๋“  ์ž‘์—…์ด ๋๋‚œ ํ›„ 'Close' ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅธ ํ›„ ํ”„๋กœ๊ทธ๋žจ์„ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.
  9. app_boxed.exe ํŒŒ์ผ์ด ์„ ํƒํ•œ ์•ฑ ํด๋”์— ๋‚˜ํƒ€๋‚  ๊ฒ๋‹ˆ๋‹ค.

์ด์ œ nw.pak ํŒŒ์ผ๊ณผ *.dll ํŒŒ์ผ๊นŒ์ง€ ํฌํ•จ๋œ ๋‹จ์ผ ์‹คํ–‰ํ˜• app_boxed.exe ํŒŒ์ผ์„ ๋ฐฐํฌํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

ํŒจํ‚ค์ง€๋ฅผ ์ž๋™ํ™”ํ•˜๊ณ ์ž ํ•œ๋‹ค๋ฉด ์ž‘์€ node.js ๋ชจ๋“ˆ์ธ enigmavirtualbox ๋ชจ๋“ˆ์ด ์žˆ์Šต๋‹ˆ๋‹ค. Enigma Virtual Box ๋ฐฐํฌ๋ณธ์„ ์ž๋™์œผ๋กœ ๋‹ค์šด๋ฐ›๊ณ  ์••์ถ•์„ ํ‘ผ ๋‹ค์Œ ํŒจํ‚ค์ง•ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•„๋ž˜์— ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

  1. npm install -g enigmavirtualbox
  2. enigmavirtualbox gen app.evp app_boxed.exe app.exe nw.pak icudtl.dat ffmpegsumo.dll libEGL.dll libGLESv2.dll (์„ค์ • ํŒŒ์ผ ์ƒ์„ฑ)
  3. enigmavirtualbox gui app.evp (์‚ฌํ›„ ์„ค์ • ํŽธ์ง‘์„ ์œ„ํ•œ ๋ช…๋ น)
  4. enigmavirtualbox cli app.evp (๋‹จ์ผ ์‹คํ–‰ ํŒŒ์ผ ์ƒ์„ฑ)

3๋ฒˆ๊นŒ์ง€ ๊ณผ์ •์œผ๋กœ app.evp ์„ค์ • ํŒŒ์ผ์ด ์ƒ๊ธด ์ดํ›„ ์žฌ๋ฐฐํฌ ์‹œ 4๋ฒˆ ๊ณผ์ •๋งŒ ์ˆ˜ํ–‰ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์œˆ๋„์šฐ ์„ค์น˜ ํŒจํ‚ค์ง€

์œ„์™€ ๊ฐ™์€ ๋‹จ์ผ ํŒจํ‚ค์ง€ ๋ฐฐํฌ ๋Œ€์‹  ์‚ฌ์šฉ์ž์—๊ฒŒ ์‰ฝ๊ฒŒ ์„ค์น˜ํ•˜๋Š” ํ™˜๊ฒฝ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌด๋ฃŒ ์„ค์น˜ ํŒจํ‚ค์ง€ ์ œ์ž‘ ํ”„๋กœ๊ทธ๋žจ์ธ Inno Setup์ด ์‰ฝ๊ฒŒ ์„ค์น˜ ํŒจํ‚ค์ง€๋ฅผ ๋งŒ๋“ค๋„๋ก ๋„์™€์ค„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์˜ˆ์ œ ์„ค์น˜ ํŒจํ‚ค์ง€ ์„ค์ • ํŒŒ์ผ์€ ๋‹ค์Œ ๋งํฌ์— ์žˆ์Šต๋‹ˆ๋‹ค: https://github.com/SSilence/sum/blob/master/setup.iss

โš ๏ธ **GitHub.com Fallback** โš ๏ธ