Erstellen einer ausführbaren Datei
Für diese Demo werden wir das pkg
Kommandozeilen-Tool verwenden. Sie können nexe
oder ein anderes Tool Ihrer Wahl wählen, aber ich finde pkg
einfacher zu benutzen. Zunächst einmal müssen wir pkg
global mit dem Befehl npm
installieren. Man kann es auch lokal installieren, um die CLI-Schnittstelle programmatisch zu nutzen.
$ npm install --global pkg
Wenn das Paket global installiert ist, erhält man den Befehl pkg
, um ausführbare Dateien zu erstellen. Der Befehl pkg
benötigt eine Eingabedatei, bei der es sich um ein JavaScript-Programm handelt, das ausgeführt wird, wenn der Benutzer auf die erzeugte ausführbare Datei doppelklickt. Andere Befehlszeilenoptionen steuern, wie die ausführbare Datei erzeugt wird.
Eingabedatei
Der Pfad der Eingabedatei wird durch das Argument <input>
angegeben, wie in unserem Fall durch den Befehl $ pkg server.js
, der ein lokaler Dateipfad ist. Wir können aber auch den Pfad zu package.json
angeben, und der Befehl pkg
verwendet die Eigenschaft bin
von package.json
, um den Pfad der JavaScript-Eingabedatei zu finden. Wenn ein Verzeichnispfad angegeben wird, sucht der Befehl pkg
die package.json
-Datei dieses Verzeichnisses anhand ihrer bin
-Eigenschaft.
Assets
Assets sind statische Ressourcen wie .html
, .js
, .css
, .png
, .json
-Dateien, die in die ausführbare Datei aufgenommen werden sollten. Um pkg
anzuweisen, solche Dateien in die ausführbare Datei aufzunehmen, müssen wir diese Dateipfade über die pkg.assets
-Eigenschaft von package.json
angeben. Sein Wert ist ein glob-Muster oder ein Array von glob-Mustern.
💡 In diesem Fall sollte
package.json
der Eingabepfad sein, damitpkg
assets
die Dateien auswählen kann, die in die ausführbare Datei aufgenommen werden sollen.
Wenn eine ausführbare Datei erstellt wird, nimmt pkg
die JavaScript-Eingabedatei zusammen mit statischen Assets in eine einzige ausführbare Datei auf. An dieser Stelle werden die Dinge ein wenig kompliziert. Da alle Projektdateien nun in eine einzige Datei gepackt sind, verlieren die relativen Dateipfade ihre Bedeutung und damit auch die Ordnerstruktur.
Aber zur Laufzeit (wenn die ausführbare Datei ausgeführt wird) sind diese Dateien in einem virtuellen Dateisystem organisiert, das als Snapshot-Dateisystem bezeichnet wird. Normalerweise haben diese Dateien zur Laufzeit das Präfix /snapshot/
(oder C:\snapshot\
in Windows) in ihrem Pfad, als ob sie sich innerhalb des /snapshot
-Verzeichnisses des Systems befinden würden.
Aber Sie können eine Asset-Datei in der ausführbaren Datei (zur Laufzeit) sicher lokalisieren, indem Sie die Methode path.join
und die Variable __dirname
verwenden, um einen relativen Pfad wie path.join( __dirname, './www/main.js' )
zu konstruieren. Der Pfad funktioniert genauso gut wie ein echter Verzeichnispfad in einem echten Dateisystem. Um mehr über das Snapshot-Dateisystem zu erfahren, lesen Sie diese Dokumentation.
💡 Achtung. Während des Kompilierungsprozesses sieht sich
pkg
dierequire()
-Anweisungen im Code an und schließt diese Dateien automatisch als statische Assets ein. Daher müssen Sie solche Dateien möglicherweise nicht als statische Elemente inpackage.json
angeben. Es gibt jedoch einige Vorbehalte, die hier erläutert werden.
Targets
Wir können eine ausführbare Datei für ein bestimmtes System mit dem --targets
Befehlszeilen-Flag erzeugen. Der Wert dieses Flags ist eine Zeichenkette im Format <node>-<platform>-<arch>
. Es könnte auch eine kommagetrennte Liste dieses Musters sein, um mehrere Systemarchitekturen anzusprechen. Sie können auch das Feld pkg.targets
der package.json
verwenden, um diese Werte anzugeben.
Der Wert node
ist eine Ziel-Hauptversion des Knotens. Der platform
-Wert ist der Name des Zielbetriebssystems und könnte einer der folgenden freebsd, linux, alpine, macos, win
sein. Der Wert arch
ist die Zielprozessorarchitektur und könnte einer der folgenden Werte sein: x64, x86, armv6, armv7
.
Wir könnten einen dieser Werte in der Zielspezifikation weglassen. In diesem Fall verwendet pkg
seinen Wert aus der aktuellen Systemkonfiguration. Wir können 'host'
als Wert für --targets
verwenden, in diesem Fall werden alle diese Werte aus der aktuellen Systemkonfiguration bezogen.
Ausgabe
Wir werden versuchen, ausführbare Dateien für die Betriebssysteme macOS und Windows zu erstellen, insbesondere für die x64
Prozessorarchitektur. Da unser Einstiegspunkt server.js
ist, werden wir die bin
-Eigenschaft von package.json
verwenden, um den Dateipfad anzugeben. Außerdem werden wir alle Dateipfade innerhalb von node_modules
und src
als statische Assets angeben, da unser server.js
davon abhängt. Unter Berücksichtigung all dieser Anforderungen sieht unser package.json
wie folgt aus.
Um die binären ausführbaren Dateien zu generieren, müssen wir den Befehl pkg .
ausführen, da pkg
die package.json
-Datei aus dem aktuellen Verzeichnis verwenden soll, um die Eingabedatei, die Assets und die Ziele zu finden. Wir könnten auch den Befehl pkg package.json
verwenden, der dasselbe tut.
Wenn dieser Befehl ausgeführt wird, lädt pkg
die entsprechenden Node.js-Binärdateien auf der Grundlage der targets
-Werte herunter und speichert sie in einem Verzeichnis, das durch die Umgebungsvariable PKG_CACHE_PATH
angegeben wird, sodass pkg
beim nächsten Mal, wenn dieselben Ziele angetroffen werden, die zwischengespeicherten Binärdateien verwenden kann.
Wenn alle Binärdateien heruntergeladen sind, erzeugt pkg
die ausführbaren Dateien im aktuellen Verzeichnis. Der Dateiname und die Erweiterung dieser Dateien werden von pkg
bestimmt und sehen normalerweise wie <package>-<target>.<ext>
aus, wobei package
der name
-Wert in package.json
ist.
Das Benennungsschema und das Ausgabeverzeichnis können jedoch mit den Optionswerten --output
oder --out-path
gesteuert werden. Wir verwenden die Option --output
, um das Ausgabeverzeichnis und den Namen der ausführbaren Datei anzugeben.
$ pkg --output build/web .
Der obige Befehl erzeugt die folgenden Dateien im Verzeichnis build
.
node-js-executable
└── build
├── web-node10-win.exe (37.4mb)
└── web-node12-macos (43.4mb)
Nun können Sie auf eine dieser Dateien doppelklicken (je nach Ihrem Rechner) und es wird eine Webseite im Standard-Systembrowser geöffnet, die die Formel 1-Treiber anzeigt.