Jak tworzyć pliki exe z aplikacji node.js?

123

Mam napisaną przeze mnie aplikację node, którą uruchamiam w następujący sposób:

node.exe app.js inputArg

Czy jest jakiś sposób, żebym mógł sam spakować to do pliku .exe? Więc mogę po prostu zrobić coś takiego?

App.exe inputArg

Mam jakiś sposób na sfałszowanie tego za pomocą pliku wsadowego, więc mogę to zrobić:

App.bat inputArg

Ale to wymaga, żebym miał wszystkie zależności i węzeł w tym folderze, co nie jest idealne.

Aishwar
źródło
1
Możliwy duplikat: stackoverflow.com/questions/6145561/ ...
Mike Christensen
Dobra lista narzędzi znajduje się tutaj: stackoverflow.com/a/12486874/32679
GrGr,
1
Myślę, że każdy, kto dodaje tutaj odpowiedź, naprawdę musi rozważyć, czy zostało już zrobione. To pytanie zamienia się w stos linków do różnych produktów open source o różnej jakości / aktywności.
Liam

Odpowiedzi:

35

Jest kilka alternatyw, zarówno bezpłatnych, jak i komercyjnych. Nie używałem żadnego z nich, ale teoretycznie powinny działać:

Większość będzie wymagała zachowania pliku wsadowego jako głównego pliku wykonywalnego, a następnie dołączenia node.exe i skryptów.

W zależności od skryptu masz również możliwość przeniesienia go do JSDB , która obsługuje łatwy sposób tworzenia plików wykonywalnych poprzez proste dołączanie do niego zasobów.

Trzecim quasi-rozwiązaniem jest trzymanie węzła w jakimś miejscu C:\utilsi dodanie tego folderu do PATHzmiennej środowiskowej. Następnie możesz utworzyć pliki .bat w tym katalogu, które uruchamiają node + preferowane skrypty - coffeew ten sposób mam coffeescript działa w systemie Windows. Tę konfigurację można zautomatyzować za pomocą pliku wsadowego, skryptu VB lub instalatora.

Ricardo Tomasi
źródło
Wyglądają dobrze i wyglądają, jakby potrafiły robić, co chcę. Spróbuję i wrócę do Ciebie.
Aishwar,
2
Wypróbowałem "Zaawansowany" konwerter Batch To EXE i działał jak marzenie. Zależności można spakować do pliku EXE. Dzięki za pomoc.
Aishwar,
1
@Aishwar, ale nie możesz spakować folderu node_modules, więc nie możesz zrobić w nim nic zaawansowanego ...
Clint,
Co się stanie, jeśli spakujesz / rar node_modules i wyodrębnisz do katalogu tymczasowego podczas działania aplikacji? Może się jednak trochę spowolnić, jeśli masz dużo modułów.
Jarrod Mosen
55

Rozwiązaniem, którego użyłem, jest node-webkit Rogera Wanga .

Jest to fantastyczny sposób na pakowanie aplikacji nodejs i ich dystrybucję, a nawet daje możliwość "spakowania" całej aplikacji jako pojedynczego pliku wykonywalnego. Obsługuje Windows, Mac i Linux.

Oto kilka dokumentów na temat różnych opcji wdrażania aplikacji node-webkit, ale w skrócie, wykonaj następujące czynności:

  1. Spakuj wszystkie swoje pliki za pomocą pliku package.json w katalogu głównym
  2. Zmień rozszerzenie z .zip na .nw
  3. copy / b nw.exe + app.nw app.exe

Jako dodatkowa uwaga - wysłałem kilka aplikacji produkcyjnych / instalacyjnych CD, używając tego i działa świetnie. Ta sama aplikacja działa w systemie Windows, Mac, Linux i w Internecie.

Aktualizacja: nazwa projektu została zmieniona na „nw.js” i jest poprawnie umieszczona tutaj: nw.js

Clayton Gulick
źródło
1
Po prostu spróbowałem, działało świetnie! I jest obsługiwany przez ludzi z firmy Intel.
Timo Huovinen
To powinna być poprawna i najbardziej aktualna odpowiedź na dzień dzisiejszy. Zobacz także ściągawkę do węzła webkit tutaj: gist.github.com/LeCoupa/80eca2716a2b13c37cce Zawiera inne bardzo przydatne rzeczy, takie jak kompilacja JS (lub przynajmniej skrócenie do bajtowego kodu w zależności od tego, jak staroświecki chcesz być na temat tego słowa "skompilować").
Erik Reppen
Podoba mi się ta odpowiedź, jednak nadal nie tworzy to samodzielnego exe. Według Intela i nw.js na Github nadal musisz mieć co najmniej dwa inne pliki w tym samym folderze: nw.pak i icudt.dll. Jak stworzyć samodzielny exe?
Jeff Baker
@JeffBaker, jeśli spojrzysz trochę w dół w dokumentach na github, możesz zobaczyć to: github.com/nwjs/nw.js/wiki/ ... co możesz zrobić, jeśli nie chcesz dołączać dodatkowych plików.
Clayton Gulick
@Clayton, Nw.js jest również kupiony przez chrome.com. developer.chrome.com/apps/migration#native
Pacerier
29

Dla każdego, kto natknie się na to pytanie, są teraz dwa projekty, które tworzą exe z projektów węzłów, Pkg i Electron.atom.io , różnią się one nieznacznie:

  1. Pkg skompiluje Twój projekt do kodu natywnego, zawiera również zasoby ORAZ instalację nodejs (system nie będzie musiał instalować nodejs, aby wykonać plik .exe). Twój kod źródłowy nie zostanie uwzględniony. Wynikowy plik wykonywalny to TYLKO Windows (.exe). Wszystkie platformy są teraz obsługiwane. Teraz wymaga licencji na produkty komercyjne. W pełni otwarte oprogramowanie.
  2. Electron.atom.io, chociaż nie będzie kompaktować i generować pliku .exe dla Ciebie, MOŻE być używany do dystrybucji aplikacji nodejs, ponieważ oferują one sposób dystrybucji aplikacji . Korzyści są takie, że elektron jest wieloplatformowy (windows, mac osx, linux), a minusem jest to, że twój kod źródłowy zostanie uwzględniony, nawet jeśli oferują sposób na dystrybucję twojej aplikacji w archiwum asar . To nie będzie kuloodporne, ale nadal jest lepsze niż twoje źródło w zwykły sposób.
sokie
źródło
2
Proszę zaktualizować: EncloseJS OBSŁUGUJE teraz Linux i OS X.
000000000000000000000
Edytowany komentarz! @ 000000000000000000000
sokie
EncloseJS to droga do zrobienia. Spróbuję tego teraz! Dziękujemy za dodanie odpowiedzi! +1 :)
tftd
Nie mogę zainstalować EncloseJS. Mówi o błędzie ELIFECYCLE kodu bez żadnego użytecznego komunikatu o błędzie.
Elmue
2
EncloseJS nie jest już konserwowane. Wydaje się, że spadkobiercą jest zeit / pkg ( npmjs.com/package/pkg )
Lucas Gonze
21

Domyślnie system Windows kojarzy .jspliki z hostem skryptów systemu Windows , samodzielnym aparatem wykonawczym JS firmy Microsoft. Jeśli wpiszesz skrypt.js w wierszu polecenia (lub dwukrotnie klikniesz .jsplik w Eksploratorze), skrypt zostanie wykonany przez wscript.exe.

Może to być rozwiązanie lokalnego problemu z ustawieniem globalnym , ale zamiast tego można skojarzyć .js pliki z node.exe, tak aby wpisanie script.js w wierszu poleceń lub dwukrotne kliknięcie / przeciągnięcie elementów do skryptów uruchomiło je w Node.

Oczywiście, jeśli - tak jak ja - skojarzyłeś .jspliki z edytorem, aby ich dwukrotne kliknięcie otworzyło Twój ulubiony edytor tekstu, ta sugestia nie przyniesie wiele dobrego. Możesz także dodać do .jsplików pozycję „Wykonaj z węzłem” w menu prawym przyciskiem myszy , chociaż ta alternatywa nie zaspokaja Twoich potrzeb w wierszu poleceń.


Najprostszym rozwiązaniem jest prawdopodobnie użycie pliku wsadowego - nie musisz mieć kopii Node w folderze, w którym znajduje się twój skrypt. Po prostu odwołaj się do pliku wykonywalnego Node absolutnie:

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

Inną alternatywą jest ta bardzo prosta aplikacja C #, która uruchomi Node przy użyciu własnej nazwy pliku + .jsjako skryptu do uruchomienia i przekaże wszystkie argumenty wiersza poleceń.

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);
    }
}

Jeśli więc nazwiesz wynikowy plik EXE „app.exe”, możesz wpisać, app arg1 ...a Node zostanie uruchomiony z wiersza poleceń "app.js" arg1 .... Zauważ, że aplikacja bootstrapper C # zostanie natychmiast zamknięta, pozostawiając Node za okno konsoli.

Ponieważ jest to prawdopodobnie stosunkowo szerokie zainteresowanie, poszedłem dalej i udostępniłem to na GitHub , w tym skompilowany plik exe, jeśli wsiadanie do samochodów dostawczych z nieznajomymi jest twoją sprawą.

josh3736
źródło
Jak wspomniałeś, to nie rozwiązuje mojego problemu w idealny sposób. Ale +1 za interesujące
lektury
@ Aishwar, dodałem prostą aplikację, która uruchomi dla Ciebie Node. Zobacz zmiany.
josh3736
@ josh3736 czy twój exe nadal wymaga, abyś miał node.exe w tym samym folderze?
Ricardo Tomasi
@RicardoTomasi, nie. Zakłada się, że Node jest zainstalowany w katalogu Program Files twojego systemu (tam, gdzie umieszcza go instalator).
josh3736
@ josh3736 To ciekawe rozwiązanie. Podoba mi się to, co zrobiłeś, chciałbym ponownie dać +1 :). Ale to wciąż nie jest idealne, ponieważ wymaga od użytkownika zainstalowania node.js w standardowej ścieżce.
Aishwar
20

Najlepszym narzędziem, jakie znam, jest narzędzie NodeJS: zeit / pkg

Jest bardzo łatwy w użyciu (znacznie więcej niż Nexe, na przykład), możesz po prostu zainstalować go globalnie: npm install -g pkg

do tworzenia plików wykonywalnych dla macOS, Linux i Windows:

pkg exampleApp.js

Miałem trochę skomplikowanego kodu, który korzystał z serwera gniazd NodeJS, próbowałem różnych aplikacji, żadna z nich nie stworzyła go poprawnie, z wyjątkiem zeit / pkg .

user8376713
źródło
Próbowałem skompaktować instalację Appium do pliku Exe i zeit / pkg całkowicie się nie powiódł. Z 310 MB na dysku powstał mały plik Exe o wielkości 18 MB, który oczywiście w ogóle nie działał.
Elmue
12

Odkąd udzielono odpowiedzi na to pytanie, uruchomiono inne rozwiązanie.

https://github.com/appjs/appjs

W chwili pisania tego tekstu jest to kompleksowe rozwiązanie do pakowania aplikacji node.js za pomocą uproszczonego pakietu chromu skompilowanego do pliku wykonywalnego.

Edycja: AppJS nie jest już aktywny, ale sam sugeruje widelec zwany deskshell.

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

bitfed
źródło
1
Wydaje się, że łącze jest zepsute.
starbeamrainbowlabs
1
Ten projekt nie jest już aktywny. Zobacz node-webkit, aby znaleźć alternatywę, o której wspomniał Clayton Gulick.
Kukks
Sam Appjs sugeruje aktywny widelec o nazwie deskshell github.com/sihorton/appjs-deskshell
bitfed
11

Jest tutaj wiele dobrych odpowiedzi, ale nie wszystkie są tak proste jak JXcore .

Po zainstalowaniu JXcore w systemie Windows wystarczy uruchomić:

jx package app.js "myAppName" -native

Spowoduje to utworzenie pliku .exe, który możesz rozpowszechniać i który można uruchomić bez żadnych zewnętrznych zależności (nie potrzebujesz nawet JXcore ani Node.js w systemie).

Oto dokumentacja dotycząca tej funkcji: http://jxcore.com/packaging-code-protection/#cat-74

Edytuj 2018

Ten projekt jest teraz martwy, ale nadal jest hostowany tutaj: https://github.com/jxcore/jxcore-release (dzięki @Elmue)

Nepoxx
źródło
1
Dzięki stary. Czy mogę zrobić plik wykonywalny Linuksa z systemu Windows?
Sasivarnan
1
O ile wiem, nie możesz. Myślę, że JXCore pobiera niektóre pliki z systemu operacyjnego, aby utworzyć plik wykonywalny, i nie pakuje tych plików, więc jeśli chcesz utworzyć plik wykonywalny Linuksa, musisz uruchomić to polecenie w systemie Linux.
Nepoxx
1
Wszystkie linki tutaj są martwe. To działa: github.com/jxcore/jxcore-release
Elmue
7

Spróbuj disclose: https://github.com/pmq20/disclose

disclose zasadniczo tworzy samorozpakowujący się plik exe z projektu Node.js i interpretera Node.js o następujących cechach,

  1. Brak GUI. Czysty CLI.
  2. Brak zależności czasu wykonywania
  3. Obsługuje zarówno Windows, jak i Unix
  4. Działa powoli po raz pierwszy (wyodrębnianie do katalogu pamięci podręcznej), a następnie szybko w nieskończoność

Spróbuj node-compiler: https://github.com/pmq20/node-compiler

Stworzyłem nowy projekt o nazwie, node-compileraby skompilować projekt Node.js w jeden plik wykonywalny.

Jest to lepsze niż discloseto, że po raz pierwszy nigdy nie działa wolno, ponieważ Twój kod źródłowy jest kompilowany wraz z interpretera Node.js, tak jak standardowe biblioteki Node.js.

Ponadto przekierowuje żądania dotyczące plików i katalogów w sposób niewidoczny dla pamięci zamiast do systemu plików w czasie wykonywania. Dzięki temu do uruchomienia skompilowanego produktu nie jest wymagany kod źródłowy.

Jak to działa: https://speakerdeck.com/pmq20/node-dot-js-compiler-compiling-your-node-dot-js-application-into-a-single-executable

W porównaniu z podobnymi projektami,

  • pkg ( https://github.com/zeit/pkg ): Pkg zhakował fs. * API dynamicznie, aby uzyskać dostęp do plików w pakiecie, podczas gdy kompilator Node.js zostawia je w spokoju i zamiast tego działa na głębszym poziomie za pośrednictwem libsquash. Pkg używa formatu JSON do przechowywania plików w pakiecie, podczas gdy kompilator Node.js wykorzystuje bardziej wyrafinowany i powszechnie używany SquashFS jako strukturę danych.

  • EncloseJS ( http://enclosejs.com/ ): EncloseJS ogranicza dostęp do plików w pakiecie tylko do pięciu API fs. *, Podczas gdy kompilator Node.js obsługuje wszystkie API fs. *. EncloseJS jest objęty licencją zastrzeżoną i pobiera opłaty, gdy jest używany, podczas gdy kompilator Node.js jest na licencji MIT, a użytkownicy mogą go używać i modyfikować.

  • Nexe ( https://github.com/nexe/nexe ): Nexe nie obsługuje dynamicznego wymagania ze względu na użycie browserify, podczas gdy Node.js Compiler obsługuje wszystkie rodzaje wymagań, w tym require.resolve.

  • asar ( https://github.com/electron/asar ): Asar używa formatu JSON do przechowywania informacji o plikach, podczas gdy kompilator Node.js używa SquashFS. Asar oddziela archiwum kodu i plik wykonywalny, podczas gdy kompilator Node.js łączy cały kod źródłowy JavaScript razem z maszyną wirtualną Node.js i generuje pojedynczy plik wykonywalny jako produkt końcowy.

  • AppImage ( http://appimage.org/ ): AppImage obsługuje tylko Linuksa z jądrem obsługującym SquashFS, podczas gdy kompilator Node.js obsługuje wszystkie trzy platformy Linux, macOS i Windows, w międzyczasie bez żadnych specjalnych wymagań dotyczących funkcji z jądra.

Minqi Pan
źródło
@ StéphaneLaurent Sprawdź kompilator węzłów, zdecydowanie obsługuje używanie argumentu wiersza polecenia z exe.
Minqi Pan
Ostatnie zatwierdzenie 30 sierpnia 2017 r. (2 lata temu). Przerwane ?!
Thach Lockevn
4

Polecam Ci BoxedApp do tego. Jest to produkt komercyjny, który działa bardzo dobrze. Działa z każdą aplikacją NodeJS. Użytkownik końcowy otrzyma tylko jeden plik EXE dla Twojej aplikacji. Nie ma potrzeby instalacji.

Na przykład w Electron użytkownik końcowy musi zainstalować / zdekompresować twoją aplikację i zobaczy wszystkie pliki źródłowe twojego kodu.

BoxedApp Pakuje wszystkie pliki i zależności, których potrzebuje Twoja aplikacja NodeJS. Obsługuje kompresję, a skompilowany plik działa w systemie Windows XP +

Kiedy go używasz, pamiętaj, aby dodać Node.EXE do skompilowanej aplikacji. Wybierz wersję węzła obsługującą system Windows XP (jeśli tego potrzebujesz)

Program obsługuje argumenty wiersza poleceń, więc po pakiecie możesz to zrobić

c:\myApp argument1

I możesz pobrać argument w swoim kodzie węzła:

process.argv[1]

Czasami twoja aplikacja ma zależności plików, więc w BoxedApp możesz dodać dowolny folder i plik jako zależność, na przykład możesz wstawić plik ustawień.

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

Więcej informacji:

Uwaga: zwykle polecam oprogramowanie typu open source / wolne, ale w tym przypadku nie znalazłem niczego, co wykonałoby zadanie.

Aminadav Glickshtein
źródło
1
Obsługuje również dobrą ochronę kodu, ponieważ dane zapisane w pamięci RAM, ale nie na dysku twardym
z0r1fan
3

Eksplorowałem ten temat od kilku dni i oto co znalazłem. Opcje dzielą się na dwie kategorie:

Jeśli chcesz zbudować aplikację komputerową, najlepsze opcje to:

1- NW.js : umożliwia wywoływanie wszystkich modułów Node.js bezpośrednio z DOM i umożliwia nowy sposób pisania aplikacji przy użyciu wszystkich technologii internetowych.

2- Electron : Twórz wieloplatformowe aplikacje komputerowe za pomocą JavaScript, HTML i CSS

Oto dobre porównanie między nimi: Porównanie NW.js i Electron . Myślę, że NW.js jest lepszy i zapewnia również aplikację do kompilowania plików JS. Istnieje również kilka samodzielnych programów do tworzenia plików wykonywalnych i instalatorów, takich jak Enigma Virtual Box . Oba zawierają osadzoną wersję Chrome, która jest niepotrzebna dla aplikacji serwerowych.

jeśli chcesz spakować aplikację serwerową, są to najlepsze opcje:

node-compiler : Kompilator Ahead-of-time (AOT) zaprojektowany dla Node.js, który po prostu działa.

Nexe : utwórz pojedynczy plik wykonywalny z aplikacji node.js.

W tej kategorii uważam, że kompilator węzłów jest lepszy, który obsługuje dynamiczne wymagania i natywne moduły węzłów. Jest bardzo łatwy w użyciu, a wyjście zaczyna się od 25 MB. Pełne porównanie z innymi rozwiązaniami można przeczytać na stronie Node Compiler. Nie czytałem wiele o Nexe, ale na razie wydaje się, że Node Compiler nie kompiluje pliku js do formatu binarnego za pomocą funkcji migawki V8, ale jest planowany dla wersji 2. Będzie miał również wbudowany kreator instalatora.

Ali
źródło
2
Electronnie uzasadnia bycia ważną sugestią dotyczącą PO; jest to zupełnie inna struktura Node.
progyammer
Świetne porównanie!
Vlad
1

Zmęczyłem się rozpoczynaniem wygranej z wiersza poleceń, a następnie natknąłem się na to. Nieznacznie ulepszona wer. nad czym josh3736 . To używa pliku XML, aby pobrać kilka ustawień. Na przykład ścieżka do Node.exeoraz plik, który ma zostać uruchomiony w domyślnym pliku app.js. Również środowisko do załadowania (produkcja, programowanie itp.), Które określiłeś w swoim app.js (lub server.js, czy jakkolwiek to nazwałeś). Zasadniczo dodaje NODE_ENV={0}gdzie {0} jest nazwą konfiguracji w app.js jako zmienną dla Ciebie. Robisz to, modyfikując element „mode” w config.xml. Możesz pobrać projekt tutaj ==> github . Zauważ, że w zdarzeniach po kompilacji możesz zmodyfikować ścieżki kopiowania, aby automatycznie kopiować plik config.xml i plik wykonywalny doNodejs katalog, aby zapisać krok. W przeciwnym razie wyedytuj je lub Twoja kompilacja wyświetli ostrzeżenie.

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);
        }
origin1tech
źródło
0

Istnieje projekt narzędzia do tworzenia open source o nazwie nodebob . Zakładam, że okna platformy roboczej,

  1. po prostu sklonuj lub pobierz projekt
  2. skopiuj wszystkie pliki projektu node-webkit do folderu aplikacji.
  3. uruchom skrypt build.bat.

Plik wykonywalny znajdziesz w folderze wydania.

cagcak
źródło