Keresés tartalomra
Kategóriák
Címkék
- Java
- Spring
- Python
- IoC
- Android
- DI
- Dagger
- Thymeleaf
- Markdown
- JDK11
- AOP
- Aspect
- Captcha
- I18n
- JavaSpark
- Microframework
- Testing
- JUnit
- Security
- JWT
- REST
- Database
- JPA
- Gépház
- WebFlux
- ReactiveProgramming
- Microservices
- Continuous Integration
- CircleCI
- Deployment Pipeline
- Docker
- Mocking
- LogProcessing
- PlantUML
- UML
- Modellezés
- OAuth2
- Node.js
- DevOps
- Websocket
Futtatható bináris készítése Node.js alkalmazásból
Némi előkészületet azért igényel a csomagolás, de viszonylag könnyen elvégezhető. Néhány megkötése azért van a folyamatnak, így a következő dolgokra oda kell figyelnünk, ha csomagolni szeretnénk az alkalmazást:
- A
pkg
tool jelenleg kizárólag ES5 dialektikájú (az elterjedt terminológiával élve CommonJS) forráskódot tud csomagolni. Természetesen ez nem azt jelenti, hogy csak ES5-ben írhatjuk meg az alkalmazást, viszont a csomagolás előtt le kell majd fordítani a forráskódot - erre ababel
nevű toolt fogjuk használni. - Az előző pontból kifolyólag semmilyen utalás sem maradhat a kódban EcmaScript Module-okra (ESM). Ez elsősorban azt jelenti, hogy
import
utasításokkal nem importálhatunk függéseket és JS fájlokat, minden esetben arequire
utasításokra kell támaszkodnunk. Ababel
fordítás során ezek persze ki lesznek cserélve a kódban, de figyeljünk rá oda, hogy ha a kódban valaholimport.meta
hívásokat használtunk, azzal ababel
nem fog kezdeni semmit, viszont a fordítás sem áll meg emiatt, csupán figyelmeztetéseket kapunk majd. - A csomagoláshoz a
pkg
-nak látnia kell a teljes függésfát az alkalmazás JS fájlai között, így például dinamikus importálások vagy külső konfigurációs fájlra támaszkodó dependency injection framework használata esetén explicit meg kell mondanunk a toolnak, hol vannak a fájlaink. - Ugyanez vonatkozik a statikus fájlokra,
asset
-ekre (képfájlok, CSS fájlok, "beégetett" konfigurációs fájlok, stb.)
Most, hogy tisztában vagyunk a feltételekkel, lássuk, hogyan tudunk hozzákezdeni a folyamathoz.
- Telepítsük a szükséges tool-okat
Adjuk hozzá az alkalmazásdev
függéseihez (vagy telepítsük globálisan) a következőket:@babel/cli
,@babel/core
,@babel/preset-env
éspkg
.
npm install -g @babel/core
npm install -g @babel/cli
npm install -g @babel/preset-env
npm install -g pkg
A babel
-nek emellett szüksége lesz egy pici konfigurációs fájlra, melyet .babelrc
néven a projekt gyökerében kell elhelyeznünk, tartalma pedig az alábbi legyen:
{
"presets": [ "@babel/preset-env" ]
}
- Fordítsuk le a forráskódot ES5 (CommonJS) dialektikára
A toolnak a forrásfájlok helyét kell megadni (ez esetben azsrc
mappa az), illetve-d
kapcsolóval azt a mappát, ahova a lefordított forráskódokat mentheti.
npx babel src -d build/target
- (Opcionális) Másoljuk az asseteket a lefordított forrásfájlok mellé
Ügyeljünk arra, hogy a becsomagolt alkalmazás ezeken az útvonalakon keresi majd az adott fájlokat. A Domino esetében például egy DI konfigurációs JSON fájlt kell mellékelnem, mely a belépési pontot jelentődomino_main.js
fájl mellett levőconfig
nevű mappában helyezkedik el. Ha nincs semmi ilyen fájlunk, ez a lépés teljes ki is maradhat. A példánál maradva, ez szimplán így néz majd ki:
mkdir build/target/config
cp config/di_config.json build/target/config/di_config.json
- Állítsuk be a szükséges opciókat a pkg számára
Ehhez apackage.json
-ban kell felvennünk néhány paramétert. Egyrészt a gyökérben vegyük fel abin
nevű paramétert, melyben a (lefordított) alkalmazás belépési pontját kell megadnunk.
{
...
"bin": "build/target/app.js",
...
}
Majd vegyük fel a pkg
-nak szóló további beállításokat, szintén a gyökérben elhelyezett pkg
kulcs alatt:
"pkg": {
"assets": ["./build/target/config/di_config.json"],
"scripts": "./build/target/**/*.js"
},
Amennyiben vannak statikus asseteink, az assets
paraméter kritikus fontosságú, enélkül a pkg
nem fogja azokat becsomagolni. Az útvonalnak természetesen ez esetben a csomagolásra váró, lefordított forráskódokat tartalmazó mappára kell mutatnia. A scripts
paraméter abban az esetben fontos, ha a függésfa nem egyértelműen feloldható. A paraméter értéke egy glob
formátumú útvonal pattern - a fenti példa azt jelenti, hogy a ./build/target
mappában és annak rekurzívan minden almappájában található összes .js
kiterjesztésű fájlt használni szeretnénk a csomagolás során.
Fontos megjegyezni, hogy a legtöbb paraméter megadható a pkg
tool parancssori argumentumaként is - én személy szerint vegyesen használom őket, nem feltétlenül követendő példa, jobb egységesíteni. :)
- Jöhet a csomagolás
Az alábbi parancs elindítja a csomagolást. A--targets
kapcsolóval szabályozhatjuk, milyen cél operációs rendszerrel dolgozunk (ez esetben standard Linux kompatibilis binárist készítünk), az--output
kapcsoló értelemszerűen az elkészült bináris mentési helyét adja, a parancs végén a.
pedig szimplán azt jelenti, hogy "használd a jelenlegi mappát". Ez esetben mindenképp szüksége van apackage.json
fájl jelenlétére, illetve abban abin
paraméter is kritikus fontosságú. Ha a.
helyett az alkalmazás belépési pontját képző.js
fájlt adjuk meg, akkor abin
paraméter elhagyható.
npx pkg --targets=linux --output=build/out/app .
És készen is vagyunk! Az így elkészült bináris ugyanúgy futtatható, mint bármilyen más (ez esetben Linux) bináris. Természetesen a tool képes Windows és MacOS rendszerekre is csomagolni. A futtatáshoz pedig természetesen nem lesz szükségünk Node.js futtatókörnyezet telepítésére, mivel az is be van csomagolva a binárisba - éppen ebből az okból a Node.js által használt standard környezeti változók (NODE_ENV
, NODE_CONF_DIR
, stb.) továbbra is használhatóak.
A pkg
tool működése kapcsolókkal még tovább finomhangolható, az alább linkelt dokumentációban azokról is találhattok bővebb információt, illetve még további példákat is.
Teljes példa a Domino alkalmazáshoz
Komment írásához jelentkezz be
Bejelentkezés
Még senki nem szólt hozzá ehhez a bejegyzéshez.