Как сделать exe-файлы из приложения node.js?

123

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

node.exe app.js inputArg

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

App.exe inputArg

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

App.bat inputArg

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

Aishwar
источник
1
Возможный обман: stackoverflow.com/questions/6145561/…
Майк Кристенсен
Хороший список инструментов находится здесь: stackoverflow.com/a/12486874/32679
GrGr
1
Я думаю, что любой, кто добавляет здесь ответ, действительно должен учитывать, было ли это уже сделано. Этот вопрос превращается в груду ссылок на различные продукты с открытым исходным кодом разного качества / активности.
Лиам,

Ответы:

35

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

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

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

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

Рикардо Томази
источник
Они хорошо выглядят и выглядят так, будто могут делать то, что я хочу. Я попробую и вернусь к вам.
Aishwar
2
Я попробовал "Advanced" Batch To EXE конвертер, и он отлично сработал. Вы можете упаковать зависимости в EXE-файл. Спасибо за помощь.
Aishwar
1
@Aishwar, но вы не можете связать папку node_modules, поэтому вы не можете делать в ней ничего продвинутого ...
Клинт
Что, если вы заархивируете / rar node_modules и извлечете во временный каталог при запуске приложения? Хотя может немного замедлиться, если у вас много модулей.
Jarrod Mosen
55

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

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

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

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

В качестве дополнительного примечания - я отправил несколько производственных коробок / установочных компакт-дисков, использующих это, и он отлично работал. Одно и то же приложение работает в Windows, Mac, Linux и в Интернете.

Обновление: название проекта было изменено на nw.js и правильно расположено здесь: nw.js

Клейтон Гулик
источник
1
Просто попробовал, отлично поработало! И это поддерживается людьми в Intel.
Timo Huovinen
Это должен быть правильный и самый актуальный ответ на сегодняшний день. См. Также шпаргалку по node webkit здесь: gist.github.com/LeCoupa/80eca2716a2b13c37cce Включает другие очень полезные вещи, например, как скомпилировать JS (или, по крайней мере, перейти к байтовому коду, в зависимости от того, насколько старомодно вы хотите быть в этом слове "компилировать").
Эрик Реппен
Мне нравится этот ответ, однако он все еще не создает автономный exe. Согласно Intel и nw.js в Github, вам все равно нужно иметь как минимум два других файла в одной папке: nw.pak и icudt.dll. Как создать автономный exe-файл?
Джефф Бейкер
@JeffBaker, если вы посмотрите немного вниз в документации на github, вы увидите это: github.com/nwjs/nw.js/wiki/… что вы можете сделать, если не хотите включать дополнительные файлы.
Clayton Gulick
@Clayton, Nw.js также доступен на chrome.com. developer.chrome.com/apps/migration#native
Pacerier,
29

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

  1. Pkg скомпилирует ваш проект в собственный код, они также включают активы И установку nodejs (системе не нужно устанавливать nodejs для выполнения .exe). Ваш исходный код не будет включен. В результате получается исполняемый файл ТОЛЬКО для Windows (.exe). Сейчас поддерживаются все платформы. Теперь требуется лицензия на коммерческие продукты. Полностью открытый исходный код.
  2. Electron.atom.io, хотя он не будет сжимать и генерировать .exe для вас, его МОЖНО использовать для распространения приложений nodejs, поскольку они предлагают способ распространения приложений . Преимущества в том, что электрон является мультиплатформенным (windows, mac osx, linux), минусы в том, что ваш исходный код БУДЕТ включен, даже если они предлагают способ распространения вашего приложения внутри архива asar . Он не будет пуленепробиваемым, но все же лучше, чем ваш исходный текст.
sokie
источник
2
Пожалуйста, обновите: EncloseJS теперь поддерживает Linux и OS X.
000000000000000000000
Отредактировал комментарий! @ 000000000000000000000
sokie
EncloseJS - это то, что вам нужно. Я собираюсь попробовать прямо сейчас! Спасибо, что добавили свой ответ! +1 :)
tftd
Я не могу установить EncloseJS. Он говорит код ошибки ELIFECYCLE без какого-либо полезного сообщения об ошибке.
Elmue
2
EncloseJS больше не поддерживается. Наследник, похоже, zeit / pkg ( npmjs.com/package/pkg )
Лукас Гонз
21

По умолчанию 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, если вам нравится садиться в фургоны с незнакомцами.

josh3736
источник
Как вы упомянули, это не идеально решает мою проблему. Но +1 за интересные чтения
Айшвар
@Aishwar, я добавил простое приложение, которое запустит за вас Node. См. Правки.
josh3736
@ josh3736 ваш exe по-прежнему требует, чтобы у вас был node.exe в той же папке?
Ricardo Tomasi
@RicardoTomasi, нет. Предполагается, что Node установлен в системном каталоге Program Files (куда его помещает установщик).
josh3736
@ josh3736 Это интересное решение. Мне нравится то, что вы сделали, я хотел бы снова +1 :). Но это все еще не идеально, так как требует, чтобы у пользователя был установлен node.js по стандартному пути.
Aishwar
20

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

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

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

pkg exampleApp.js

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

user8376713
источник
Я попытался сжать установку Appium в Exe-файл, и zeit / pkg полностью не удалось. Из 310 МБ на диске получился небольшой EXE-файл размером 18 МБ, который, очевидно, вообще не работал.
Elmue
12

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

https://github.com/appjs/appjs

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

Изменить: AppJS больше не активен, но сам предлагает вилку под названием deskshell.

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

bitfed
источник
1
Вроде бы неработающая ссылка.
starbeamrainbowlabs
1
Этот проект больше не активен. См. Node-webkit для альтернативы, упомянутой Клейтоном Гуликом.
куккс
Сам Appjs предлагает активную вилку под названием deskshell github.com/sihorton/appjs-deskshell
bitfed
11

Здесь есть много хороших ответов, но не все они такие простые, как 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)

Nepoxx
источник
1
Спасибо друг. Могу ли я сделать исполняемый файл linux из Windows?
Сасиварнан
1
Насколько я знаю, нет, нельзя. Я думаю, что JXCore захватывает некоторые файлы из ОС, чтобы сделать исполняемый файл, и не упаковывает эти файлы, поэтому, если вы хотите создать исполняемый файл Linux, вам придется запустить эту команду в Linux.
Nepoxx
2
JXcore остановил разработку nubisa.com/nubisa-halting-active-development-on-jxcore-platform
user619271
1
Все ссылки здесь мертвы. Это работает: github.com/jxcore/jxcore-release
Elmue
7

Попробуйте 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 ограничивает доступ к файлам в пакете только пятью API-интерфейсами fs. *, Тогда как Node.js Compiler поддерживает все API-интерфейсы fs. *. EncloseJS имеет проприетарную лицензию и взимает деньги при использовании, в то время как Node.js Compiler имеет лицензию MIT, и пользователи могут использовать его и изменять.

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

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

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

Минци Пан
источник
@ StéphaneLaurent Проверьте node-compiler, он определенно поддерживает использование аргумента командной строки с exe.
Minqi Pan
Последний коммит 30 августа 2017 г. (2 года назад). Снято с производства ?!
Thach Lockevn
4

Я рекомендую вам 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()

Больше информации:

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

Аминадав Гликштейн
источник
1
Он также поддерживает хорошую защиту кода, поскольку данные сохраняются в ОЗУ, но не на жестком диске
z0r1fan
3

Я обнаружил, что любое из этих решений соответствует моим требованиям, поэтому создал свою собственную версию узла под названием node2exe, которая делает это. Он доступен по адресу https://github.com/areve/node2exe.

areve
источник
3

Я изучаю эту тему несколько дней и вот что я нашел. Варианты делятся на две категории:

Если вы хотите создать настольное приложение, лучшие варианты:

1- NW.js : позволяет вызывать все модули Node.js прямо из DOM и обеспечивает новый способ написания приложений со всеми веб-технологиями.

2- Electron : создавайте кроссплатформенные настольные приложения с помощью JavaScript, HTML и CSS.

Вот хорошее сравнение между ними: NW.js и Electron по сравнению . Я думаю, что NW.js лучше, и он также предоставляет приложение для компиляции файлов JS. Существуют также отдельные сборщики исполняемых файлов и установщиков, такие как Enigma Virtual Box . Оба они содержат встроенную версию Chrome, которая не нужна для серверных приложений.

Если вы хотите упаковать серверное приложение, это лучшие варианты:

node-compiler : Опережающий компилятор (AOT), разработанный для Node.js, который просто работает.

Nexe : создайте единственный исполняемый файл из ваших приложений node.js

В этой категории я считаю, что компилятор узлов лучше, который поддерживает динамические требуемые и собственные модули узлов. Его очень легко использовать, а размер вывода начинается с 25 МБ. Вы можете прочитать полное сравнение с другими решениями на странице Node Compiler. Я не очень много читал о Nexe, но сейчас кажется, что Node Compiler не компилирует файл js в двоичный формат с помощью функции моментального снимка V8, но он запланирован для версии 2. Он также будет иметь встроенный конструктор установщика.

Али
источник
2
Electronне оправдывает быть действительным предложением по проблеме OP; это совершенно другая структура Node.
progyammer 04
Отличное сравнение!
Влад
1

Устал начинать выигрыш из командной строки, тогда я тоже наткнулся на это. Немного улучшенная вер. над чем josh3736 . При этом используется XML-файл для получения некоторых настроек. Например, путь, Node.exeа также файл для запуска в app.js. по умолчанию. Также загружаемая среда (production, dev и т. Д.), Которую вы указали в своем app.js (или server.js, или как там вы его называли). По сути, он добавляет, NODE_ENV={0}где {0} - это имя вашей конфигурации в app.js в качестве переменной для вас. Вы делаете это, изменяя элемент «режим» в config.xml. Вы можете взять проект здесь ==> директория, просто чтобы сохранить шаг. В противном случае отредактируйте их, иначе ваша сборка выдаст предупреждение. github . Обратите внимание, что в событиях Post Build вы можете изменить пути копирования, чтобы автоматически копировать файл config.xml и исполняемый файл на свойNodejs

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
источник
1

Может быть много других вариантов, но, насколько мне известно, есть один проект в активной разработке на GitHub https://github.com/zeit/pkg . Вы можете поиграть с этим. Еще один на https://github.com/nexe/nexe, но не в активной разработке.

Рохит Лутра
источник
0

Существует проект инструмента сборки с открытым исходным кодом под названием nodebob . Я предполагаю, что рабочие окна платформы,

  1. просто клонировать или скачать проект
  2. скопируйте все ваши файлы проекта node-webkit в папку приложения.
  3. запустите скрипт build.bat.

Вы найдете исполняемый файл внутри папки выпуска.

cagcak
источник