Skapa en körbar fil
För den här demonstrationen kommer vi att använda pkg
kommandoradsverktyg. Det står dig fritt att välja nexe
eller något annat valfritt men jag tycker att pkg
är lättare att använda. Först och främst måste vi installera pkg
globalt med hjälp av kommandot npm
. Du kan också installera det lokalt för att använda CLI-gränssnittet programmatiskt.
$ npm install --global pkg
När paketet är globalt installerat får du kommandot pkg
för att skapa körbara filer. Kommandot pkg
behöver en inmatningsfil som är ett inmatat JavaScript-program som kommer att köras när användaren dubbelklickar på den genererade körbara filen. Andra kommandoradsalternativ styr hur den körbara filen genereras.
Inträdesfil
Inträdesfilens sökväg tillhandahålls genom <input>
argumentet, såsom $ pkg server.js
kommandot i vårt fall som är en lokal filväg. Men vi kan också ange sökvägen till package.json
och kommandot pkg
kommer att använda bin
-egenskapen för package.json
för att hitta sökvägen till den ingående JavaScript-filen. Om en katalogsökväg anges letar kommandot pkg
efter package.json
-filen i den katalogen och använder dess bin
-egenskap.
Assets
Assets är statiska resurser som .html
, .js
, .css
, .png
, .json
-filer som ska ingå i den körbara filen. För att instruera pkg
att inkludera sådana filer i den körbara filen måste vi ange dessa filvägar genom pkg.assets
-egenskapen i package.json
. Värdet är ett globmönster eller en array av globmönster.
💡 I det här fallet bör
package.json
vara inmatningssökvägen så attpkg
kan väljaassets
som behöver inkluderas i den körbara filen.
När en körbar fil skapas kommer pkg
att inkludera den inmatade JavaScript-filen tillsammans med statiska tillgångar i en enda körbar fil. Det är här som saker och ting blir lite komplicerade. Eftersom alla projektfiler nu är packade i en enda fil förlorar de relativa filvägarna sin betydelse och det gör även mappstrukturen.
Men vid körning (när den körbara filen körs) organiseras dessa filer i ett virtuellt filsystem som kallas för ett snapshot-filsystem. Vanligtvis har dessa filer vid körning /snapshot/
(eller C:\snapshot\
i Windows) prefix i sin sökväg som om de ligger i /snapshot
-katalogen i systemet.
Men du kan säkert hitta en tillgångsfil i den körbara filen (vid körning) med hjälp av path.join
-metoden och __dirname
-variabeln för att konstruera en relativ sökväg som path.join( __dirname, './www/main.js' )
. Sökvägen kommer att fungera precis som om du har en riktig katalogsökväg i ett riktigt filsystem. Om du vill veta mer om snapshot-filsystemet kan du läsa den här dokumentationen.
💡 Se upp. Under kompileringsprocessen tittar
pkg
pårequire()
-angivelserna i koden och inkluderar automatiskt dessa filer som statiska tillgångar. Därför kanske du inte behöver ange sådana filer som statiska tillgångar ipackage.json
. Det finns dock några förbehåll som förklaras här.
Mål
Vi kan generera en körbar fil för ett specifikt system med hjälp av kommandoradsflaggan --targets
. Värdet för denna flagga en sträng i formatet <node>-<platform>-<arch>
. Det kan också vara en kommaseparerad lista med detta mönster för att rikta in sig på flera systemarkitekturer. Du kan också använda pkg.targets
-fältet i package.json
för att ange dessa värden.
Värdet node
är ett mål för huvudversionen av noden. Värdet platform
är namnet på måloperativsystemet och kan vara något av följande freebsd, linux, alpine, macos, win
. Värdet arch
är målprocessorarkitekturen och det kan vara ett av dessa x64, x86, armv6, armv7
.
Vi kan utelämna ett av dessa värden från målspecifikationen. I så fall använder pkg
sitt värde från den aktuella systemkonfigurationen. Vi kan använda 'host'
som värde för --targets
i vilket fall alla dessa värden erhålls från den aktuella systemkonfigurationen.
Output
Vi kommer att försöka skapa körbara filer för operativsystemen macOS och Windows, särskilt för x64
processorarkitektur. Eftersom vår ingångspunkt är server.js
kommer vi att använda bin
-egenskapen för package.json
för att ange dess filsökväg. Vi kommer också att nämna alla filvägar inom node_modules
och src
som statiska tillgångar eftersom vår server.js
är beroende av den. Med tanke på alla dessa krav ser vår package.json
ut som nedan.
För att generera de binära körbara filerna måste vi köra kommandot pkg .
eftersom vi vill att pkg
ska använda package.json
-filen från den aktuella katalogen för att hitta inmatningsfilen, tillgångar och mål. Vi kan också använda kommandot pkg package.json
som också gör samma sak.
När det här kommandot körs laddar pkg
ner lämpliga binära Node.js-filer baserat på targets
-värdena och cachelagrar dem i en katalog som specificeras av miljövariabeln PKG_CACHE_PATH
, så att pkg
kan använda de cachelagrade binära filerna nästa gång när samma mål påträffas.
När alla binära filer har laddats ner genererar pkg
de körbara filerna i den aktuella katalogen. Filnamnet och tillägget för dessa filer bestäms av pkg
och ser normalt ut som <package>-<target>.<ext>
där package
är name
-värdet i package.json
.
Hur som helst kan vi styra namngivningsschemat och utdatakatalogen med hjälp av optionsvärdena --output
eller --out-path
. Vi kommer att använda flaggan --output
för att ange utdatakatalogen och namnet på den körbara filen.
$ pkg --output build/web .
Kommandot ovan genererar följande filer i katalogen build
.
node-js-executable
└── build
├── web-node10-win.exe (37.4mb)
└── web-node12-macos (43.4mb)
Nu kan du dubbelklicka på någon av dessa filer (enligt din maskin) och det kommer att öppna en webbsida i systemets standardwebbläsare som visar formel en drivrutiner.
.