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
- PyPI
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
pkgtool 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 ababelnevű 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
importutasításokkal nem importálhatunk függéseket és JS fájlokat, minden esetben arequireutasításokra kell támaszkodnunk. Ababelfordítás során ezek persze ki lesznek cserélve a kódban, de figyeljünk rá oda, hogy ha a kódban valaholimport.metahívásokat használtunk, azzal ababelnem 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ásdevfü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 azsrcmappa az), illetve-dkapcsoló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.jsfájl mellett levőconfignevű 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 abinnevű 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--targetskapcsolóval szabályozhatjuk, milyen cél operációs rendszerrel dolgozunk (ez esetben standard Linux kompatibilis binárist készítünk), az--outputkapcsoló é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.jsonfájl jelenlétére, illetve abban abinparaméter is kritikus fontosságú. Ha a.helyett az alkalmazás belépési pontját képző.jsfájlt adjuk meg, akkor abinparamé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.