Как сделать exe-файлы из приложения node.js? - PullRequest
109 голосов
/ 17 ноября 2011

У меня есть приложение для узла, которое я написал и которое я запускаю следующим образом:

node.exe app.js inputArg

Есть ли какой-нибудь способ, которым я могу упаковать это в .exe самостоятельно?Так что я могу просто сделать что-то вроде этого?

App.exe inputArg

У меня есть способ подделать это с помощью командного файла, поэтому я могу сделать это:

App.bat inputArg

Но для этого необходимо, чтобы у меня были все зависимости и узел в этой папке, что не идеально.

Ответы [ 16 ]

47 голосов
/ 06 марта 2014

Решение, которое я использовал, это node-webkit Роджера Вана .

Это фантастический способ упаковки приложений nodejs и их распространения, он даже дает вам возможность «связать» все приложение в один исполняемый файл. Он поддерживает Windows, Mac и Linux.

Здесь - это несколько документов по различным вариантам развертывания приложений node-webkit, но в двух словах вы делаете следующее:

  1. Заархивируйте все ваши файлы с пакетом .json в корне
  2. Изменить расширение с .zip на .nw
  3. copy / b nw.exe + app.nw app.exe

Так же, как добавленное примечание - я поставил несколько производственных приложений box / install cd, используя это, и он отлично работал. Это же приложение работает на Windows, Mac, Linux и в Интернете.

30 голосов
/ 18 ноября 2011

Есть несколько альтернатив, как бесплатных, так и коммерческих. Я не использовал ни одного из них, но теоретически они должны работать:

Большинство из них потребует от вас сохранить командный файл в качестве основного исполняемого файла, а затем связать node.exe и ваши сценарии.

В зависимости от вашего сценария у вас также есть возможность перенести его на JSDB , который поддерживает простой способ создания исполняемых файлов , просто добавляя к нему ресурсы.

Третье квази-решение - сохранить узел где-то вроде C:\utils и добавить эту папку в переменную окружения PATH. Затем вы можете создавать .bat файлы в этом каталоге, который запускает node + ваши любимые скрипты - я получил coffeescript coffee, работающий с окнами таким образом. Эта настройка может быть автоматизирована с помощью командного файла, VB-скрипта или установщика.

26 голосов
/ 27 октября 2015

Для тех, кто сталкивается с этим вопросом, теперь есть два проекта, которые создают exe-файлы из ваших проектов узлов: Pkg и Electron.atom.io , они немного отличаются:

  1. Pkg скомпилирует ваш проект в собственный код, они также включают ресурсы и установку nodejs (системе не нужно устанавливать nodejs для выполнения .exe). Ваш исходный код не будет включен. Полученный исполняемый файл - ТОЛЬКО для Windows (.exe). Теперь поддерживаются все платформы. Теперь требуется лицензия для коммерческих продуктов. Полностью открытый исходный код.
  2. Electron.atom.io , хотя он не будет сжимать и генерировать .exe для вас, он МОЖЕТ использоваться для распространения приложений nodejs, поскольку они предлагают способ распространения приложений . Преимущества в том, что Electron является мультиплатформенным (Windows, Mac OSX, Linux), минусы в том, что ваш исходный код будет включен, даже если они предлагают способ распространения вашего приложения в архиве asar . Это не будет пуленепробиваемым, но все же лучше, чем ваш источник на равнине.
22 голосов
/ 18 ноября 2011

По умолчанию Windows связывает .js файлы с Windows Script Host , автономным механизмом выполнения JS от Microsoft.Если вы введете script.js в командной строке (или дважды щелкните файл .js в Проводнике), сценарий будет выполнен с помощью wscript.exe.

Это может быть решить локальную проблему с глобальным параметром , но вы можете связать .js файлы с node.exe, чтобы набрать script.js в командной строке илидвойной щелчок / перетаскивание элементов в сценарии запускает их с Node.

Конечно, если - как я - вы связали .js файлов с редактором, так что двойной щелчок по ним открывает ваш любимый текстредактор, это предложение не принесет много пользы.Вы также можете добавить в меню .js правой кнопкой мыши пункт меню «Выполнить с узлом», хотя эта альтернатива не решает ваши потребности командной строки.


Возможно, самое простое решение - просто использовать командный файл - вам не нужно иметь копию Node в папке, в которой находится ваш скрипт. Просто обращайтесь к исполняемому файлу Node абсолютно:

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

Другой альтернативой является это очень простое приложение на C #, которое запускает Node, используя собственное имя файла + .js в качестве сценария для запуска, и передает любые аргументы командной строки.

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

Так что если вы назовете получившийся EXE"app.exe", вы можете набрать app arg1 ... и Node будет запущен из командной строки "app.js" arg1 ....Обратите внимание, что приложение начальной загрузки C # немедленно выйдет, оставив Node ответственным за окно консоли.

Поскольку это, вероятно, представляет довольно большой интерес, я сделал это доступным на GitHub , включая скомпилированный exe , если вам нужен фургон с незнакомцами.

14 голосов
/ 26 октября 2017

Лучший инструмент, который я знаю, это инструмент NodeJS: zeit / pkg

Он очень прост в использовании (гораздо больше, чем Nexe, просто в качестве примера), вы можете просто установить глобально: npm install -g pkg

для создания исполняемых файлов для macOS, Linux и Windows:

pkg exampleApp.js

У меня был немного сложный код, который использовал сервер сокетов NodeJS, я пробовал разные приложения, ни одно из них не создавало его должным образом, кроме zeit / pkg .

12 голосов
/ 20 января 2013

Поскольку на этот вопрос был дан ответ, было запущено другое решение.

https://github.com/appjs/appjs

На момент написания этой статьи это конечное решение для упаковки node.jsприложения через урезанный пакет хрома, скомпилированный в исполняемый файл.

Редактировать: AppJS больше не активен, но сам по себе предлагает форк, называемый дескшлом.

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

11 голосов
/ 18 декабря 2014

Здесь есть много хороших ответов, но они не так просты, как JXcore .

После установки JXcore в Windows все, что вам нужно сделать, это запустить:

jx package app.js "myAppName" -native

В результате будет создан файл .exe, который вы можете распространять и который можно запускать без каких-либо внешних зависимостей (вам даже не нужны ни JXcore, ни Node.js в системе).

Вот документация по этой функции: http://jxcore.com/packaging-code-protection/#cat-74

Редактировать 2018

Этот проект сейчас мертв, но он все еще находится здесь: https://github.com/jxcore/jxcore-release (спасибо @Elmue)

11 голосов
/ 01 сентября 2014

Не пробовал, но nexe выглядит так, как будто nexe может сделать это:

https://github.com/crcn/nexe

5 голосов
/ 04 августа 2016

Попробуйте disclose: https://github.com/pmq20/disclose

disclose по сути делает самораспаковывающийся exe-файл из вашего проекта Node.js и интерпретатора Node.js со следующими характеристиками:

  1. Без графического интерфейса.Чистый CLI.
  2. Нет зависимостей времени выполнения
  3. Поддерживает как Windows, так и Unix
  4. Запускаетсяв первый раз медленно (извлечение в каталог кэша), затем быстро навсегда

Попробуйте node-compiler: https://github.com/pmq20/node-compiler

Я создал новый проект под названием node-compiler для компиляции вашего проекта Node.js в один исполняемый файл.

Это лучше, чем disclose в том, что он никогда не запускается медленно в первый раз, так как ваш исходный код скомпилирован вместе с интерпретатором Node.jsТакже как и стандартные библиотеки Node.js.

Кроме того, он прозрачно перенаправляет запросы файлов и каталогов в память, а не в файловую систему во время выполнения.Так что для запуска скомпилированного продукта не требуется исходный код.

Как это работает: https://speakerdeck.com/pmq20/node-dot-js-compiler-compiling-your-node-dot-js-application-into-a-single-executable

По сравнению с аналогичными проектами

  • pkg(https://github.com/zeit/pkg): Pkg взломал fs. * API динамически для доступа к файлам в пакете, тогда как Node.js Compiler оставляет их в покое и вместо этого работает на более глубоком уровне с помощью libsquash. Pkg использует JSON для хранения файлов в пакетев то время как Node.js Compiler использует более сложную и широко используемую SquashFS в качестве своей структуры данных.

  • EncloseJS (http://enclosejs.com/): EncloseJS ограничивает доступ к файлам в пакете только пятью fs. * API, тогда как Node.js Compiler поддерживает все API fs. *. EncloseJS является проприетарной лицензией и взимает плату при использовании, в то время как Node.js Compiler лицензирован в MIT, и пользователи могут свободно использовать его и свободно изменять.

  • Nexe (https://github.com/nexe/nexe): Nexe не поддерживает динамическое требование из-за его использования browserify, тогда как компилятор Node.js поддерживает все виды требований, включая требуемыйe.resolve.

  • asar (https://github.com/electron/asar): Asar использует JSON для хранения информации о файлах, в то время как Node.js Compiler использует SquashFS.Asar хранит архив кода и исполняемый файл отдельно, а компилятор Node.js связывает весь исходный код JavaScript вместе с виртуальной машиной Node.js и создает один исполняемый файл в качестве конечного продукта.

  • AppImage(http://appimage.org/): AppImage поддерживает только Linux с ядром, поддерживающим SquashFS, в то время как Node.js Compiler поддерживает все три платформы Linux, macOS и Windows, без каких-либо специальных требований к ядру.

4 голосов
/ 09 января 2017

Я рекомендую вам BoxedApp для этого.Это коммерческий продукт, который работает очень хорошо.Это работает для любого приложения NodeJS.Конечный пользователь получит только один EXE-файл для вашего приложения.Нет необходимости в установке.

Например, в Electron конечному пользователю необходимо установить / распаковать ваше приложение, и он увидит все исходные файлы вашего кода.

BoxedApp Упаковкавсе файлы и зависимости, которые нужны вашему приложению NodeJS.Он поддерживает сжатия, и скомпилированный файл работает в Windows XP +

. При его использовании обязательно добавьте Node.EXE в скомпилированное приложение.Выберите версию узла, которая поддерживает Windows XP (если вам это нужно)

Программа поддерживает аргументы командной строки, поэтому после пакета вы можете сделать

c:\myApp argument1

И вы можете получить аргумент вкод вашего узла:

process.argv[1]

Иногда ваше приложение имеет зависимости от файлов, поэтому в BoxedApp вы можете добавить любую папку и файл в качестве зависимости, например, вы можете вставить файл настроек.

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

Подробнее:

Просто примечание: обычно я рекомендую использовать программное обеспечение с открытым исходным кодом / бесплатное программное обеспечение, но в данном случае я этого не сделалнашел что-нибудь, что выполняет работу.

...