Een uitvoerbaar bestand maken
Voor deze demo gaan we pkg
command-line tool gebruiken. U bent vrij om nexe
of een ander programma naar keuze te kiezen, maar ik vind pkg
makkelijker in gebruik. Allereerst moeten we pkg
globaal installeren met het npm
commando. U kunt het ook lokaal installeren om de CLI interface programmatisch te gebruiken.
$ npm install --global pkg
Als het pakket eenmaal globaal is geïnstalleerd, krijgt u het pkg
commando om uitvoerbare bestanden te maken. De pkg
-opdracht heeft een invoerbestand nodig dat een JavaScript-programma is dat wordt uitgevoerd wanneer de gebruiker dubbelklikt op het gegenereerde uitvoerbare bestand. Andere command-line opties bepalen hoe het uitvoerbare bestand wordt gegenereerd.
Entry File
Het entry-bestandspad wordt gegeven via het <input>
argument, zoals het $ pkg server.js
commando in ons geval, dat een lokaal bestandspad is. Maar we kunnen ook het pad naar package.json
opgeven en het pkg
commando zal de bin
eigenschap van de package.json
gebruiken om het pad van het entry JavaScript bestand te vinden. Als een directory pad is opgegeven, dan zoekt het pkg
commando naar het package.json
bestand van die directory gebruik makend van de bin
eigenschap.
Assets
Assets zijn statische bronnen zoals .html
, .js
, .css
, .png
, .json
bestanden die in het uitvoerbare bestand moeten worden opgenomen. Om pkg
te instrueren om dergelijke bestanden in het uitvoerbare bestand op te nemen, moeten we deze bestandspaden opgeven via pkg.assets
property van package.json
. De waarde hiervan is een glob pattern of een array van glob patterns.
💡 In dit geval moet
package.json
het invoerpad zijn, zodatpkg
assets
kan kiezen die in het uitvoerbare bestand moeten worden opgenomen.
Wanneer een uitvoerbaar bestand is gemaakt, zal pkg
het ingevoerde JavaScript-bestand samen met statische elementen in één uitvoerbaar bestand opnemen. Dit is waar de dingen een beetje ingewikkeld worden. Omdat alle project bestanden nu zijn verpakt in een enkel bestand, verliezen de relatieve bestandspaden hun betekenis en zo ook de mappenstructuur.
Maar tijdens runtime (wanneer het uitvoerbare bestand draait), zijn deze bestanden georganiseerd in een virtueel bestandssysteem dat een snapshot bestandssysteem wordt genoemd. Gewoonlijk hebben deze bestanden in runtime /snapshot/
(of C:\snapshot\
in windows) voorvoegsel in hun pad alsof ze zich in /snapshot
directory van het systeem bevinden.
Maar u kunt veilig een asset bestand in het uitvoerbare bestand lokaliseren (in runtime) door gebruik te maken van de path.join
methode en __dirname
variabele om een relatief pad te construeren zoals path.join( __dirname, './www/main.js' )
. Het pad zal net zo werken als een echt directory pad in een echt bestandssysteem. Lees deze documentatie om meer te weten te komen over het snapshot-bestandssysteem.
💡 Pas op. Tijdens het compilatieproces kijkt
pkg
naar derequire()
-statements in de code en neemt deze bestanden automatisch op als statische elementen. Daarom hoeft u dergelijke bestanden wellicht niet als static assets in depackage.json
op te nemen. Er zijn echter enkele voorbehouden, zoals hier wordt uitgelegd.
Targets
We kunnen een uitvoerbaar bestand voor een specifiek systeem genereren met de --targets
command-line vlag. De waarde van deze vlag is een string in het formaat <node>-<platform>-<arch>
. Het zou ook een door komma’s gescheiden lijst van dit patroon kunnen zijn om meerdere systeemarchitecturen te targeten. U zou ook het pkg.targets
veld van de package.json
kunnen gebruiken om deze waarden op te geven.
De node
waarde is een doel-major versie van de Node. De platform
waarde is de naam van het doel-besturingssysteem en het zou een van deze freebsd, linux, alpine, macos, win
kunnen zijn. De arch
-waarde is de architectuur van de doelprocessor en kan een van de volgende zijn x64, x86, armv6, armv7
.
We kunnen een van deze waarden weglaten uit de doelspecificatie. In dat geval gebruikt pkg
zijn waarde uit de huidige systeemconfiguratie. We kunnen 'host'
gebruiken als waarde voor de --targets
in dat geval worden al deze waarden verkregen uit de huidige systeemconfiguratie.
Output
We zullen proberen uitvoerbare bestanden te maken voor de besturingssystemen macOS en Windows, met name voor de processorarchitectuur x64
. Aangezien ons startpunt server.js
is, zullen we bin
eigenschap van de package.json
gebruiken om het bestandspad aan te geven. Ook zullen we alle bestandspaden in node_modules
en src
vermelden als statische activa, omdat onze server.js
daarvan afhankelijk is. Al deze vereisten in aanmerking genomen, ziet onze package.json
er als volgt uit.
Om de binaire uitvoerbare bestanden te genereren, moeten we pkg .
commando uitvoeren, omdat we willen dat pkg
het package.json
bestand uit de huidige directory gebruikt om het invoerbestand, de assets en de targets te vinden. We kunnen ook pkg package.json
commando gebruiken, dat hetzelfde doet.
Zodra dit commando is uitgevoerd, downloadt pkg
de juiste Node.js binaries gebaseerd op de targets
waarden en slaat ze op in een directory gespecificeerd door de PKG_CACHE_PATH
omgevingsvariabele, zodat de volgende keer wanneer dezelfde targets worden tegengekomen, pkg
de binaire bestanden in de cache kan gebruiken.
Zodra alle binaire bestanden zijn gedownload, genereert pkg
de uitvoerbare bestanden in de huidige directory. De bestandsnaam en extensie van deze bestanden wordt bepaald door pkg
en ziet er normaal uit als <package>-<target>.<ext>
waarbij package
de name
waarde is in de package.json
.
Het naamgevingsschema en de uitvoerdirectory kunnen we echter regelen met de --output
of --out-path
optie waarden. We gaan --output
gebruiken om de uitvoermap en de naam van het uitvoerbare bestand op te geven.
$ pkg --output build/web .
Het bovenstaande commando genereert de volgende bestanden in build
map.
node-js-executable
└── build
├── web-node10-win.exe (37.4mb)
└── web-node12-macos (43.4mb)
Nu kunt u dubbelklikken op een van deze bestanden (volgens uw machine) en het zal een webpagina openen in de standaard systeem browser die de formule een drivers.