Wie erstelle ich exe-Dateien aus einer node.js-App?


123

Ich habe eine Knoten-App, die ich geschrieben habe und die ich wie folgt ausführe:

node.exe app.js inputArg

Gibt es eine Möglichkeit, dies selbst in eine EXE-Datei zu packen? Also kann ich so etwas einfach machen?

App.exe inputArg

Ich habe eine Möglichkeit, dies mithilfe einer Batch-Datei vorzutäuschen, damit ich Folgendes tun kann:

App.bat inputArg

Dies setzt jedoch voraus, dass ich alle Abhängigkeiten und Knoten in diesem Ordner habe, was nicht ideal ist.




Eine gute Liste von Werkzeugen finden Sie hier: stackoverflow.com/a/12486874/32679
GrGr

1
Ich denke, jeder, der hier eine Antwort hinzufügt, muss wirklich überlegen, ob dies bereits geschehen ist. Diese Frage wird zu einem Stapel von Links zu verschiedenen Open-Source-Produkten unterschiedlicher Qualität / Aktivität.
Liam

Antworten:


35

Es gibt einige kostenlose und kommerzielle Alternativen. Ich habe keine von ihnen verwendet, aber theoretisch sollten sie funktionieren:

In den meisten Fällen müssen Sie die Batchdatei als ausführbare Hauptdatei beibehalten und dann node.exe und Ihre Skripte bündeln.

Abhängig von Ihrem Skript haben Sie auch die Möglichkeit, es auf JSDB zu portieren. Dies unterstützt eine einfache Möglichkeit, ausführbare Dateien zu erstellen, indem Sie einfach Ressourcen an das Skript anhängen.

Eine dritte Quasi-Lösung besteht darin, den Knoten an einem ähnlichen Ort zu belassen C:\utilsund diesen Ordner Ihrer PATHUmgebungsvariablen hinzuzufügen . Dann können Sie in diesem Verzeichnis .bat-Dateien erstellen, auf denen node + Ihre bevorzugten Skripte ausgeführt werden. coffeeAuf diese Weise funktioniert Coffeescript unter Windows. Dieses Setup kann mit einer Batch-Datei, einem VB-Skript oder einem Installationsprogramm automatisiert werden.


Diese sehen gut aus und sehen so aus, als könnten sie tun, was ich will. Ich werde es versuchen und mich bei Ihnen melden.
Aishwar

2
Ich habe den "Advanced" Batch To EXE-Konverter ausprobiert und er hat wie ein Zauber funktioniert. Sie können die Abhängigkeiten in die EXE-Datei packen. Danke für die Hilfe.
Aishwar

1
@Aishwar, aber Sie können den Ordner node_modules nicht bündeln, also können Sie nichts Fortgeschrittenes darin tun ...
Clint

Was ist, wenn Sie knip / rar node_modules zippen und bei Ausführung der Anwendung in ein temporäres Verzeichnis extrahieren? Könnte allerdings etwas langsam werden, wenn Sie viele Module haben.
Jarrod Mosen

55

Die Lösung, die ich verwendet habe, ist Roger Wangs Node-Webkit .

Dies ist eine fantastische Möglichkeit, NodeJS-Apps zu verpacken und zu verteilen. Sie haben sogar die Möglichkeit, die gesamte App als einzelne ausführbare Datei zu "bündeln". Es unterstützt Windows, Mac und Linux.

Hier sind einige Dokumente über die verschiedenen Optionen für die Bereitstellung von Knoten-Webkit - Anwendungen, aber auf den Punkt gebracht, tun Sie folgendes:

  1. Komprimieren Sie alle Ihre Dateien mit einer package.json im Stammverzeichnis
  2. Ändern Sie die Erweiterung von .zip in .nw
  3. copy / b nw.exe + app.nw app.exe

Nur als zusätzliche Anmerkung: Ich habe damit mehrere Produktionsbox- / Installations-CD-Anwendungen ausgeliefert, und es hat großartig funktioniert. Dieselbe App läuft unter Windows, Mac, Linux und über das Internet.

Update: Der Projektname wurde in 'nw.js' geändert und befindet sich hier richtig: nw.js.


1
Habe es einfach versucht, hat super funktioniert! Und es wird von Leuten bei Intel unterstützt.
Timo Huovinen

Dies sollte ab heute die richtige und aktuellste Antwort sein. Siehe auch das Cheat-Sheet für das Node-Webkit hier: gist.github.com/LeCoupa/80eca2716a2b13c37cce Enthält andere äußerst nützliche Dinge wie das Kompilieren des JS (oder zumindest das Zusammenfassen von Byte-Code, je nachdem, wie altmodisch Sie über das Wort sein möchten "kompilieren").
Erik Reppen

Ich mag diese Antwort, aber dies schafft immer noch keine eigenständige Exe. Laut Intel und nw.js bei Github müssen sich noch mindestens zwei weitere Dateien im selben Ordner befinden: nw.pak und icudt.dll. Wie erstellt man eine eigenständige Exe?
Jeff Baker

@JeffBaker Wenn Sie in den Dokumenten auf github ein wenig nach unten schauen, sehen Sie Folgendes: github.com/nwjs/nw.js/wiki/…. Dies können Sie tun, wenn Sie keine zusätzlichen Dateien hinzufügen möchten.
Clayton Gulick

@Clayton, Nw.js wird auch von chrome.com bouched. developer.chrome.com/apps/migration#native
Pacerier

29

Für alle , über diese Frage zu stolpern, gibt es nun zwei Projekte , die EXE - Dateien aus Ihrem Knoten Projekte erstellen, Pkg und Electron.atom.io , sie unterscheiden sich geringfügig:

  1. Pkg kompiliert Ihr Projekt zu nativem Code, es enthält auch Assets UND eine NodeJS-Installation (das System muss NodeJS nicht installieren, um die EXE-Datei auszuführen). Ihr Quellcode wird nicht enthalten sein. Die resultierende ausführbare Datei ist NUR Windows (.exe). Alle Plattformen werden jetzt unterstützt. Es erfordert jetzt eine Lizenz für kommerzielle Produkte. Vollständig Open Source.
  2. Electron.atom.io wird zwar nicht komprimiert und generiert keine EXE-Datei für Sie. Es kann jedoch zum Verteilen von NodeJS-Apps verwendet werden, da diese eine Möglichkeit zum Verteilen von Anwendungen bieten . Die Vorteile sind, dass Electron plattformübergreifend ist (Windows, Mac OSX, Linux). Die Nachteile sind, dass Ihr Quellcode enthalten sein wird, auch wenn sie eine Möglichkeit bieten, Ihre App in einem ASAR- Archiv zu verteilen . Es wird nicht kugelsicher sein, aber es ist immer noch besser als Ihre Quelle in der Ebene.

2
Bitte aktualisieren: EncloseJS unterstützt jetzt Linux und OS X.
000000000000000000000

Kommentar bearbeitet! @ 000000000000000000000
Sokie

EncloseJS ist der richtige Weg. Ich werde es gleich versuchen! Vielen Dank für Ihre Antwort! +1 :)
tftd

Ich kann EncloseJS nicht installieren. Es heißt Err-Code ELIFECYCLE ohne nützliche Fehlermeldung.
Elmue

2
EncloseJS wird nicht mehr gepflegt. Der Erbe scheint zeit / pkg zu sein ( npmjs.com/package/pkg )
Lucas Gonze

21

Standardmäßig ordnet Windows .jsDateien dem Windows Script Host zu , der eigenständigen JS-Laufzeit-Engine von Microsoft. Wenn Sie an einer Eingabeaufforderung script.js eingeben (oder .jsim Explorer auf eine Datei doppelklicken ), wird das Skript von ausgeführt wscript.exe.

Dies kann ein lokales Problem mit einem globalen Umfeld zu lösen , aber man konnte assoziieren .js Dateien mit node.exestatt, so dass der Eingabe script.js an einer Eingabeaufforderung oder einen Doppelklick / Ziehen Elemente auf Skripte werden sie mit Knoten starten.

Wenn Sie - wie ich - .jsDateien mit einem Editor verknüpft haben, sodass ein Doppelklick darauf Ihren bevorzugten Texteditor öffnet, hilft dieser Vorschlag natürlich nicht viel. Sie können Dateien auch einen Rechtsklick-Menüeintrag "Mit Knoten ausführen" hinzufügen.js , obwohl diese Alternative Ihre Befehlszeilenanforderungen nicht erfüllt.


Die einfachste Lösung besteht wahrscheinlich darin, nur eine Batch-Datei zu verwenden. Sie müssen keine Kopie von Node in dem Ordner haben, in dem sich Ihr Skript befindet. Verweisen Sie einfach auf die ausführbare Node-Datei:

"C:\Program Files (x86)\nodejs\node.exe" app.js %*

Eine andere Alternative ist diese sehr einfache C # -App, die Node mit seinem eigenen Dateinamen + .jsals Skript zum Ausführen startet und alle Befehlszeilenargumente weitergibt.

class Program
{
    static void Main(string[] args)
    {
        var info = System.Diagnostics.Process.GetCurrentProcess();
        var proc = new System.Diagnostics.ProcessStartInfo(@"C:\Program Files (x86)\nodejs\node.exe", "\"" + info.ProcessName + ".js\" " + String.Join(" ", args));
        proc.UseShellExecute = false;
        System.Diagnostics.Process.Start(proc);
    }
}

Wenn Sie also die resultierende EXE-Datei "app.exe" nennen, können Sie Folgendes eingeben, app arg1 ...und Node wird mit der Befehlszeile gestartet "app.js" arg1 .... Beachten Sie, dass die C # -Bootstrapper-App sofort beendet wird und Node für das Konsolenfenster verantwortlich ist.

Da dies wahrscheinlich von relativ großem Interesse ist, habe ich dies auf GitHub verfügbar gemacht , einschließlich der kompilierten Exe, wenn es Ihr Ding ist, mit Fremden in Lieferwagen zu steigen.


Wie Sie bereits erwähnt haben, löst dies mein Problem nicht auf ideale Weise. Aber +1 für die interessanten Lesungen
Aishwar

@Aishwar, ich habe eine einfache App hinzugefügt, die Node für Sie startet. Siehe Änderungen.
Josh 3736

@ josh3736 Benötigt Ihre Exe immer noch, dass Sie node.exe im selben Ordner haben?
Ricardo Tomasi

@ RicardoTomasi, nein. Es wird davon ausgegangen, dass Node im Programmdateiverzeichnis Ihres Systems installiert ist (wo das Installationsprogramm es ablegt).
Josh3736

@ josh3736 Dies ist eine interessante Lösung. Ich mag was du getan hast, ich wünschte ich könnte wieder +1 :). Dies ist jedoch immer noch nicht ideal, da der Benutzer node.js installiert und im Standardpfad haben muss.
Aishwar

20

Das beste Tool, das ich kenne, ist das NodeJS-Tool: zeit / pkg

Es ist sehr einfach zu bedienen (viel mehr als Nexe, nur als Beispiel), Sie können es einfach global installieren: npm install -g pkg

So erstellen Sie ausführbare Dateien für MacOS, Linux und Windows:

pkg exampleApp.js

Ich hatte ein bisschen komplizierten Code, der den NodeJS-Socket-Server verwendete. Ich habe verschiedene Anwendungen ausprobiert, keine von ihnen hat ihn richtig erstellt, außer zeit / pkg .


Ich habe versucht, eine Appium-Installation in eine Exe-Datei zu komprimieren, und zeit / pkg ist vollständig fehlgeschlagen. Aus den 310 MB auf der Festplatte ergab sich eine kleine Exe-Datei von 18 MB, die offensichtlich überhaupt nicht funktionierte.
Elmue


12

Seit diese Frage beantwortet wurde, wurde eine andere Lösung gestartet.

https://github.com/appjs/appjs

Zum Zeitpunkt dieses Schreibens ist dies die Endlösung für das Packen von node.js-Apps über ein abgespecktes Chrompaket, das in eine ausführbare Datei kompiliert wurde.

Bearbeiten: AppJS ist nicht mehr aktiv, schlägt jedoch selbst eine Gabelung namens Deskshell vor.

https://github.com/sihorton/appjs-deskshell/


1
Scheint ein defekter Link zu sein.
Starbeamrainbowlabs

1
Dieses Projekt ist nicht mehr aktiv. Eine von Clayton Gulick erwähnte Alternative finden Sie im Node-Webkit.
Kukks

Appjs selbst genannt , eine aktive Gabel schlägt deskshell github.com/sihorton/appjs-deskshell
bitfed

11

Hier gibt es viele gute Antworten, aber sie sind nicht alle so einfach wie JXcore .

Sobald Sie JXcore unter Windows installiert haben, müssen Sie nur noch Folgendes ausführen:

jx package app.js "myAppName" -native

Dadurch wird eine EXE-Datei erstellt, die Sie verteilen und ohne externe Abhängigkeiten ausführen können (Sie benötigen nicht einmal JXcore oder Node.js auf dem System).

Hier ist die Dokumentation zu dieser Funktionalität: http://jxcore.com/packaging-code-protection/#cat-74

Bearbeiten Sie 2018

Das Projekt ist jetzt tot, aber es wird immer noch hier gehostet: https://github.com/jxcore/jxcore-release (danke @Elmue)


1
Danke Kumpel. Kann ich eine Linux-Datei unter Windows ausführbar machen?
Sasivarnan

1
Soweit ich weiß, nein, das kannst du nicht. Ich denke, JXCore greift auf einige Dateien vom Betriebssystem zu, um die ausführbare Datei zu erstellen, und packt diese Dateien nicht. Wenn Sie also eine ausführbare Linux-Datei erstellen möchten, müssen Sie diesen Befehl unter Linux ausführen.
Nepoxx


1
Alle Links hier sind tot. Dies funktioniert: github.com/jxcore/jxcore-release
Elmue

7

Versuchen Sie disclose: https://github.com/pmq20/disclose

disclose macht im Wesentlichen eine selbstextrahierende Exe aus Ihrem Node.js-Projekt und Node.js-Interpreter mit den folgenden Eigenschaften:

  1. Keine GUI. Reine CLI.
  2. Keine Laufzeitabhängigkeiten
  3. Unterstützt sowohl Windows als auch Unix
  4. Läuft zum ersten Mal langsam (Extrahieren in ein Cache-Verzeichnis) und dann für immer schnell

Versuchen Sie node-compiler: https://github.com/pmq20/node-compiler

Ich habe ein neues Projekt namens erstellt node-compiler, um Ihr Node.js-Projekt in eine einzige ausführbare Datei zu kompilieren.

Es ist besser als insofern, als disclosees zum ersten Mal nie langsam läuft, da Ihr Quellcode zusammen mit dem Node.js-Interpreter kompiliert wird, genau wie die Standardbibliotheken von Node.js.

Darüber hinaus werden Datei- und Verzeichnisanforderungen zur Laufzeit transparent in den Speicher anstatt in das Dateisystem umgeleitet. Damit ist kein Quellcode erforderlich, um das kompilierte Produkt auszuführen.

So funktioniert es: https://speakerdeck.com/pmq20/node-dot-js-compiler-compiling-your-node-dot-js-application-into-a-single-executable

Vergleich mit ähnlichen Projekten,

  • pkg ( https://github.com/zeit/pkg ): Pkg hat fs. * APIs dynamisch gehackt, um auf In-Package-Dateien zuzugreifen, während Node.js Compiler sie in Ruhe lässt und stattdessen über libsquash auf einer tieferen Ebene arbeitet. Pkg verwendet JSON zum Speichern von In-Package-Dateien, während Node.js Compiler das komplexere und weit verbreitete SquashFS als Datenstruktur verwendet.

  • EncloseJS ( http://enclosejs.com/ ): EncloseJS beschränkt den Zugriff auf In-Package-Dateien auf nur fünf fs. * APIs, während Node.js Compiler alle fs. * APIs unterstützt. EncloseJS ist proprietär lizenziert und berechnet Geld, wenn es verwendet wird, während Node.js Compiler MIT-lizenziert ist und Benutzer es sowohl verwenden als auch ändern können.

  • Nexe ( https://github.com/nexe/nexe ): Nexe unterstützt aufgrund der Verwendung von browserify keine dynamischen Anforderungen, während der Node.js Compiler alle Arten von Anforderungen unterstützt, einschließlich require.resolve.

  • asar ( https://github.com/electron/asar ): Asar verwendet JSON zum Speichern der Dateiinformationen , während Node.js Compiler SquashFS verwendet. Asar hält das Codearchiv und die ausführbare Datei getrennt, während Node.js Compiler den gesamten JavaScript-Quellcode mit der virtuellen Maschine Node.js verknüpft und eine einzige ausführbare Datei als Endprodukt generiert.

  • AppImage ( http://appimage.org/ ): AppImage unterstützt nur Linux mit einem Kernel, der SquashFS unterstützt, während Node.js Compiler alle drei Plattformen von Linux, macOS und Windows unterstützt, ohne dass der Kernel spezielle Funktionsanforderungen stellt.


@ StéphaneLaurent Check out Node-Compiler, es unterstützt definitiv die Verwendung eines Befehlszeilenarguments mit der exe.
Minqi Pan

Letztes Commit am 30. August 2017 (vor 2 Jahren). Abgesetzt?!
Thach Lockevn

4

Ich empfehle Ihnen BoxedApp dafür. Es ist ein kommerzielles Produkt, das sehr gut funktioniert. Es funktioniert für jede NodeJS-App. Der Endbenutzer erhält nur eine EXE-Datei für Ihre App. Keine Installation erforderlich.

In Electron muss der Endbenutzer beispielsweise Ihre App installieren / dekomprimieren, und er sieht alle Quelldateien Ihres Codes.

BoxedApp Es packt alle Dateien und Abhängigkeiten, die Ihre NodeJS-App benötigt. Es unterstützt Komprimierungen und die kompilierte Datei funktioniert unter Windows XP +

Wenn Sie es verwenden, müssen Sie der kompilierten App Node.EXE hinzufügen. Wählen Sie eine Knotenversion, die Windows XP unterstützt (falls erforderlich)

Das Programm unterstützt Befehlszeilenargumente. Nach dem Paket können Sie dies tun

c:\myApp argument1

Und Sie können das Argument in Ihrem Knotencode erhalten:

process.argv[1]

Manchmal hat Ihre App Dateiabhängigkeiten, sodass Sie in BoxedApp jeden Ordner und jede Datei als Abhängigkeit hinzufügen können. Beispielsweise können Sie eine Einstellungsdatei einfügen.

var mySettings=require('fs').readFileSync('./settings.jgon').toString()

Mehr Info:

Nur eine Anmerkung: Normalerweise empfehle ich Open-Source- / freie Software, aber in diesem Fall habe ich nichts gefunden, was die Arbeit erledigt.


1
Es unterstützt auch einen guten
Codeschutz

3

Ich habe festgestellt, dass eine dieser Lösungen meinen Anforderungen entspricht, und habe daher meine eigene Version des Knotens namens node2exe erstellt, die dies tut. Es ist unter https://github.com/areve/node2exe verfügbar


3

Ich habe dieses Thema seit einigen Tagen untersucht und hier ist, was ich gefunden habe. Optionen fallen in zwei Kategorien:

Wenn Sie eine Desktop-App erstellen möchten, sind die besten Optionen:

1- NW.js : Mit dieser Option können Sie alle Node.js-Module direkt aus dem DOM aufrufen und eine neue Methode zum Schreiben von Anwendungen mit allen Webtechnologien aktivieren .

2- Electron : Erstellen Sie plattformübergreifende Desktop-Apps mit JavaScript, HTML und CSS

Hier ist ein guter Vergleich zwischen ihnen: NW.js & Electron Compared . Ich denke, NW.js ist besser und es bietet auch eine Anwendung zum Kompilieren von JS-Dateien. Es gibt auch einige eigenständige ausführbare Datei- und Installationsprogramme wie Enigma Virtual Box . Beide enthalten eine eingebettete Version von Chrome, die für Server-Apps nicht erforderlich ist.

Wenn Sie eine Server-App verpacken möchten, sind dies die besten Optionen:

Node-Compiler : AOT -Compiler (Ahead-of-Time) für Node.js, der einfach funktioniert.

Nexe : Erstellen Sie eine einzelne ausführbare Datei aus Ihren node.js-Apps

In dieser Kategorie ist der Node-Compiler meiner Meinung nach besser, da er dynamische Anforderungs- und native Node-Module unterstützt. Es ist sehr einfach zu bedienen und die Ausgabe beginnt bei 25 MB. Einen vollständigen Vergleich mit anderen Lösungen finden Sie auf der Seite Node Compiler. Ich habe nicht viel über Nexe gelesen, aber im Moment scheint Node Compiler die js-Datei nicht mit der V8-Snapshot-Funktion in das Binärformat zu kompilieren, aber es ist für Version 2 geplant. Es wird auch einen integrierten Installer-Builder geben.


2
Electronrechtfertigt nicht, ein gültiger Vorschlag für das Problem des OP zu sein; Es ist ein ganz anderes Node-Framework.
Programmierer

Toller Vergleich!
Vlad


1

Ich habe es satt, an der Eingabeaufforderung mit dem Sieg zu beginnen, und bin dann auch darauf gestoßen. Leicht verbessert ver. über was josh3736 . Hierbei wird eine XML-Datei verwendet, um einige Einstellungen abzurufen. Zum Beispiel der Pfad zu Node.exesowie die Datei, die in der Standard-App.js gestartet werden soll. Auch die zu ladende Umgebung (Produktion, Entwicklung usw.), die Sie in Ihrer app.js (oder server.js oder wie auch immer Sie es genannt haben) angegeben haben. Im Wesentlichen NODE_ENV={0}wird hinzugefügt, wobei {0} der Name Ihrer Konfiguration in app.js als Variable für Sie ist. Sie tun dies, indem Sie das Element "mode" in der Datei config.xml ändern. Sie können das Projekt hier herunterladen ==> github . Beachten Sie, dass Sie in den Post Build-Ereignissen die Kopierpfade so ändern können, dass sie automatisch über Ihre config.xml und die ausführbare Datei in Ihre kopiert werdenNodejsVerzeichnis, nur um einen Schritt zu speichern. Andernfalls bearbeiten Sie diese oder Ihr Build gibt eine Warnung aus.

var startInfo = new ProcessStartInfo();
        startInfo.FileName = nodepath;
        startInfo.Arguments = apppath;
        startInfo.UseShellExecute = false;
        startInfo.CreateNoWindow = false;
        startInfo.WindowStyle = ProcessWindowStyle.Hidden;

        if(env.Length > 0)
            startInfo.EnvironmentVariables.Add("NODE_ENV", env);

        try
        {
            using (Process p = Process.Start(startInfo))
            {
                p.WaitForExit();
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message.ToString(), "Start Error", MessageBoxButtons.OK);
        }


0

Es gibt ein OpenSource-Build-Tool-Projekt namens Nodebob . Ich gehe davon aus, dass Arbeitsplattformfenster,

  1. Projekt einfach klonen oder herunterladen
  2. Kopieren Sie alle Ihre Node-Webkit-Projektdateien in den App-Ordner.
  3. Führen Sie das Skript build.bat aus.

Sie finden die ausführbare Datei im Release-Ordner.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.