Skabelse af en eksekverbar fil
I denne demo bruger vi pkg
kommandolinjeværktøjet. Du kan frit vælge nexe
eller andet efter eget valg, men jeg finder pkg
nemmere at bruge. Først og fremmest skal vi installere pkg
globalt ved hjælp af npm
kommando. Du kan også installere den lokalt for at bruge CLI-grænsefladen programmatisk.
$ npm install --global pkg
Når pakken er installeret globalt, får du kommandoen pkg
til at oprette eksekverbare filer. Kommandoen pkg
har brug for en inputfil, som er et indtastet JavaScript-program, der skal køres, når brugeren dobbeltklikker på den genererede eksekverbare fil. Andre kommandolinjeindstillinger styrer, hvordan den eksekverbare fil genereres.
Indtastningsfil
Indtastningsfilens sti angives via <input>
-argumentet som f.eks. kommandoen $ pkg server.js
i vores tilfælde, som er en lokal filsti. Men vi kan også angive stien til package.json
, og pkg
-kommandoen vil bruge bin
-egenskaben i package.json
til at finde stien til JavaScript-indgangsfilen. Hvis der angives en mappesti, søger pkg
-kommandoen efter package.json
-filen i den pågældende mappe ved hjælp af dens bin
-egenskab.
Assets
Assets er statiske ressourcer såsom .html
, .js
, .css
, .png
, .json
-filer, der skal medtages i den eksekverbare fil. For at give pkg
besked om at inkludere sådanne filer i den eksekverbare fil skal vi angive disse filstier via pkg.assets
-egenskaben i package.json
. Dens værdi er et glob-mønster eller et array af glob-mønstre.
💡 I dette tilfælde skal
package.json
være indgangsstien, såpkg
kan vælgeassets
, der skal inkluderes i den eksekverbare fil.
Når en eksekverbar fil oprettes, vil pkg
inkludere den indgående JavaScript-fil sammen med statiske aktiver i en enkelt eksekverbar fil. Det er her, at tingene bliver lidt komplicerede. Da alle projektfiler nu er pakket ind i en enkelt fil, mister de relative filstier deres betydning, og det samme gør mappestrukturen.
Men på køretid (når den eksekverbare fil kører) er disse filer organiseret i et virtuelt filsystem kaldet et snapshot-filsystem. Normalt har disse filer på køretid /snapshot/
(eller C:\snapshot\
i Windows) præfiks i deres sti, som om de er placeret i /snapshot
-mappen i systemet.
Men du kan sikkert finde en aktivfil i den eksekverbare fil (på køretid) ved hjælp af path.join
-metoden og __dirname
-variablen for at konstruere en relativ sti som path.join( __dirname, './www/main.js' )
. Stien vil fungere lige så godt, som hvis du har en rigtig mappesti i et rigtigt filsystem. Hvis du vil vide mere om snapshot-filsystemet, kan du læse denne dokumentation.
💡 Pas på. Under kompileringsprocessen ser
pkg
pårequire()
-angivelserne i koden og inkluderer automatisk disse filer som statiske aktiver. Derfor behøver du måske ikke at angive sådanne filer som statiske aktiver ipackage.json
. Der er dog nogle forbehold, som forklaret her.
Targets
Vi kan generere en eksekverbar fil til et bestemt system ved hjælp af kommandolinjeflaget --targets
. Værdien af dette flag en streng i <node>-<platform>-<arch>
-formatet. Det kan også være en kommasepareret liste med dette mønster for at målrette flere systemarkitekturer. Du kan også bruge pkg.targets
-feltet i package.json
til at angive disse værdier.
Værdien node
er en målmajorversion af knudepunktet. platform
-værdien er navnet på måloperativsystemet, og det kan være et af disse freebsd, linux, alpine, macos, win
. Værdien arch
er målprocessorarkitekturen, og det kunne være en af disse x64, x86, armv6, armv7
.
Vi kunne udelade en af disse værdier fra målspecifikationen. I så fald bruger pkg
sin værdi fra den aktuelle systemkonfiguration. Vi kan bruge 'host'
som værdi for --targets
, i hvilket tilfælde alle disse værdier fås fra den aktuelle systemkonfiguration.
Output
Vi vil forsøge at oprette eksekverbare filer til styresystemerne macOS og Windows, især for x64
processorarkitektur. Da vores indgangspunkt er server.js
, vil vi bruge bin
-egenskaben for package.json
til at angive dens filsti. Vi vil også nævne alle filstier inden for node_modules
og src
som statiske aktiver, da vores server.js
er afhængig af den. I betragtning af alle disse krav ser vores package.json
ud som nedenfor.
For at generere de binære eksekverbare filer skal vi udføre kommandoen pkg .
, da vi ønsker, at pkg
skal bruge package.json
-filen fra den aktuelle mappe til at finde inputfilen, aktiverne og målene. Vi kunne også bruge kommandoen pkg package.json
, som også gør det samme.
Når denne kommando er kørt, downloader pkg
passende binære Node.js-filer baseret på targets
-værdierne og gemmer dem i en mappe, der er angivet af miljøvariablen PKG_CACHE_PATH
, så pkg
næste gang, når der støder på de samme mål, kan bruge de gemte binære filer.
Når alle binære filer er downloadet, genererer pkg
de eksekverbare filer i den aktuelle mappe. Filnavnet og udvidelsen af disse filer bestemmes af pkg
og ligner normalt <package>-<target>.<ext>
, hvor package
er name
-værdien i package.json
.
Det er dog muligt at styre navngivningsskemaet og outputmappen ved hjælp af optionsværdierne --output
eller --out-path
. Vi vil bruge --output
-flaget til at angive outputmappen og navnet på den eksekverbare fil.
$ pkg --output build/web .
Overstående kommando genererer følgende filer inde i build
-mappen.
node-js-executable
└── build
├── web-node10-win.exe (37.4mb)
└── web-node12-macos (43.4mb)
Nu kan du dobbeltklikke på en af disse filer (som på din maskine), og det vil åbne en webside i standardsystemets browser, der viser formel en drivere.