Sådan opretter du en eksekverbar fil (.exe) fra JavaScript-kode (ved hjælp af Node.js)

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
(kilde: gist.github.com)

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ælge assets, 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 pkgrequire()-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 i package.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.

(kilde: gist.github.com)

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.

(http://127.0.0.1:52254/)

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.