Crearea unui fișier executabil
Pentru acest demo, vom folosi pkg
instrumentul de linie de comandă. Sunteți liberi să alegeți nexe
sau altul la alegere, dar eu consider că pkg
este mai ușor de utilizat. Mai întâi de toate, trebuie să instalăm pkg
la nivel global folosind comanda npm
. De asemenea, îl puteți instala local pentru a utiliza interfața CLI în mod programatic.
$ npm install --global pkg
După ce pachetul este instalat la nivel global, veți obține comanda pkg
pentru a crea executabile. Comanda pkg
are nevoie de un fișier de intrare care este un program JavaScript de intrare care va rula atunci când utilizatorul va face dublu clic pe fișierul executabil generat. Alte opțiuni ale liniei de comandă controlează modul în care este generat fișierul executabil.
File de intrare
Calea fișierului de intrare este furnizată prin intermediul argumentului <input>
, cum ar fi comanda $ pkg server.js
în cazul nostru, care este o cale de fișier local. Dar putem, de asemenea, să furnizăm calea către package.json
, iar comanda pkg
va utiliza proprietatea bin
a package.json
pentru a localiza calea fișierului JavaScript de intrare. Dacă este furnizată calea unui director, atunci comanda pkg
caută fișierul package.json
din acel director folosește proprietatea bin
a acestuia.
Assets
Assets sunt resurse statice, cum ar fi fișierele .html
, .js
, .css
, .png
, .json
care trebuie incluse în executabil. Pentru a instrui pkg
să includă astfel de fișiere în executabil, trebuie să furnizăm aceste căi de acces la fișiere prin intermediul proprietății pkg.assets
din package.json
. Valoarea acesteia este un model glob sau o matrice de modele glob.
💡 În acest caz,
package.json
ar trebui să fie calea de intrare, astfel încâtpkg
să poată alegeassets
care sunt necesare pentru a fi incluse în executabil.
Când este creat un executabil, pkg
va include fișierul JavaScript de intrare împreună cu activele statice într-un singur fișier executabil. Aici lucrurile se complică puțin. Deoarece toate fișierele proiectului sunt acum împachetate într-un singur fișier, căile relative ale fișierelor își pierd semnificația și la fel și structura dosarelor.
Dar în timpul execuției (când executabilul rulează), aceste fișiere sunt organizate într-un sistem de fișiere virtual numit sistem de fișiere instantaneu. De obicei, aceste fișiere în timpul execuției au prefixul /snapshot/
(sau C:\snapshot\
în Windows) în calea lor ca și cum ar fi localizate în interiorul directorului /snapshot
al sistemului.
Dar puteți localiza în siguranță un fișier activ în executabil (în timpul execuției) folosind metoda path.join
și variabila __dirname
pentru a construi o cale relativă, cum ar fi path.join( __dirname, './www/main.js' )
. Calea va funcționa foarte bine ca și cum ați avea o cale de directoare reală într-un sistem de fișiere real. Pentru a afla mai multe despre sistemul de fișiere snapshot, citiți această documentație.
💡 Atenție. În timpul procesului de compilare,
pkg
se uită la declarațiilerequire()
din cod și include automat aceste fișiere ca active statice. Prin urmare, este posibil să nu fie nevoie să specificați aceste fișiere ca active statice înpackage.json
. Cu toate acestea, există unele avertismente, după cum se explică aici.
Targets
Potem genera un fișier executabil pentru un sistem specific utilizând steagul de linie de comandă --targets
. Valoarea acestui indicator un șir de caractere în formatul <node>-<platform>-<arch>
. Ar putea fi, de asemenea, o listă separată prin virgulă de acest model pentru a viza mai multe arhitecturi de sistem. De asemenea, ați putea utiliza câmpul pkg.targets
din package.json
pentru a specifica aceste valori.
Valoarea node
este o versiune majoră țintă a nodului. Valoarea platform
este numele sistemului de operare țintă și ar putea fi unul dintre aceste freebsd, linux, alpine, macos, win
. Valoarea arch
este arhitectura procesorului țintă și ar putea fi una dintre aceste x64, x86, armv6, armv7
.
Am putea omite una dintre aceste valori din specificația țintă. În acest caz, pkg
utilizează valoarea sa din configurația curentă a sistemului. Putem folosi 'host'
ca valoare pentru --targets
, caz în care toate aceste valori sunt obținute din configurația curentă a sistemului.
Output
Vom încerca să creăm fișiere executabile pentru sistemele de operare macOS și Windows, în special pentru arhitectura procesorului x64
. Deoarece punctul nostru de intrare este server.js
, vom folosi proprietatea bin
a package.json
pentru a indica calea fișierului său. De asemenea, vom menționa toate căile de fișier din interiorul node_modules
și src
ca active statice, deoarece server.js
al nostru depinde de acesta. Având în vedere toate aceste cerințe, package.json
al nostru arată ca mai jos.
Pentru a genera fișierele executabile binare, trebuie să executăm comanda pkg .
, deoarece dorim ca pkg
să utilizeze fișierul package.json
din directorul curent pentru a localiza fișierul de intrare, activele și țintele. Am putea, de asemenea, să folosim comanda pkg package.json
care, de asemenea, face același lucru.
După ce această comandă este executată, pkg
descarcă fișierele binare Node.js corespunzătoare pe baza valorilor targets
și le stochează într-un director specificat de variabila de mediu PKG_CACHE_PATH
, astfel încât data viitoare când se întâlnesc aceleași ținte, pkg
ar putea folosi fișierele binare stocate în memoria cache.
După ce toate fișierele binare sunt descărcate, pkg
generează fișierele executabile în directorul curent. Numele de fișier și extensia acestor fișiere este decisă de pkg
și în mod normal arată ca <package>-<target>.<ext>
unde package
este valoarea name
din package.json
.
Cu toate acestea, putem controla schema de denumire și directorul de ieșire folosind valorile opțiunilor --output
sau --out-path
. Vom folosi indicatorul --output
pentru a specifica directorul de ieșire și numele fișierului executabil.
$ pkg --output build/web .
Comanda de mai sus generează următoarele fișiere în interiorul directorului build
.
node-js-executable
└── build
├── web-node10-win.exe (37.4mb)
└── web-node12-macos (43.4mb)
Acum puteți face dublu clic pe oricare dintre aceste fișiere (conform mașinii dvs.) și se va deschide o pagină web în browserul implicit al sistemului care va afișa driverele din formula unu.
.