Как сделать exe-файлы из приложения node.js?
У меня есть приложение для узла, которое я написал и которое я запускаю следующим образом:
node.exe app.js inputArg
Есть ли способ, которым я могу упаковать это в.exe самостоятельно? Так что я могу сделать что-то подобное?
App.exe inputArg
У меня есть способ подделать это с помощью командного файла, поэтому я могу сделать это:
App.bat inputArg
Но для этого необходимо, чтобы у меня были все зависимости и узел в этой папке, что не идеально.
22 ответа
Есть несколько альтернатив, как бесплатных, так и коммерческих. Я не использовал ни одного из них, но теоретически они должны работать:
- Iexpress (родной инструмент Windows)
- Компилятор быстрых пакетных файлов (коммерческий)
- BoxedApp Packer
- "Advanced" Batch To EXE Converter " (бесплатная версия)
Большинство из них потребует от вас сохранить командный файл в качестве основного исполняемого файла, а затем связать node.exe и ваши скрипты.
В зависимости от вашего сценария у вас также есть возможность перенести его в JSDB, который поддерживает простой способ создания исполняемых файлов, просто добавляя к нему ресурсы.
Третье квази-решение - сохранить узел где-то вроде C:\utils
и добавьте эту папку в свой PATH
переменная окружения. Затем вы можете создавать.bat файлы в этом каталоге, который запускает node + ваши любимые скрипты - я получил coffeescript's coffee
работать на окнах таким образом. Эта настройка может быть автоматизирована с помощью пакетного файла, VB-скрипта или установщика.
Решением, которое я использовал, является нод-webkit Роджера Вана.
Это фантастический способ упаковки приложений nodejs и их распространения, он даже дает вам возможность "связать" все приложение в один исполняемый файл. Он поддерживает Windows, Mac и Linux.
Вот несколько документов по различным вариантам развертывания приложений node-webkit, но вкратце вы делаете следующее:
- Заархивируйте все ваши файлы с пакетом.json в корне
- Измените расширение с.zip на.nw
- copy / b nw.exe + app.nw app.exe
Так же, как добавленное примечание - я поставил несколько производственных приложений box/install cd, используя это, и это отлично работает. Это же приложение работает на Windows, Mac, Linux и через Интернет.
Для тех, кто наткнулся на этот вопрос, теперь есть два проекта, которые создают exes из ваших проектов узлов, EncloseJS и http://electron.atom.io/, они немного отличаются:
- EncloseJS скомпилирует ваш проект в нативный код, они также включают ресурсы и установку nodejs (системе не нужно устанавливать nodejs для выполнения.exe). Ваш исходный код не будет включен.
Получающийся исполняемый файл - ТОЛЬКО для Windows (.exe).Все платформы поддерживаются. Теперь требуется лицензия на коммерческие продукты. - Electron.atom.io, хотя он не будет компактировать и генерировать.exe для вас, он МОЖЕТ использоваться для распространения приложений nodejs, поскольку они предлагают способ распространения приложений. Преимущества в том, что Electron является мультиплатформенным (Windows, Mac OSX, Linux), минусы в том, что ваш исходный код будет включен, даже если они предлагают способ распространения вашего приложения в архиве asar. Это не будет пуленепробиваемым, но все же лучше, чем ваш источник на равнине.
Лучший инструмент, который я знаю, это инструмент NodeJS: zeit / pkg
Он очень прост в использовании (гораздо больше, чем Nexe, просто в качестве примера), вы можете просто установить глобально:npm install -g pkg
создать исполняемые файлы для macOS, Linux и Windows:
pkg exampleApp.js
У меня был немного сложный код, который использовал сервер сокетов NodeJS, я пробовал разные приложения, ни одно из них не создавало его должным образом, кроме zeit / pkg.
По умолчанию 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, если вам нравится входить в фургоны с незнакомыми людьми.
Так как на этот вопрос был дан ответ, было запущено другое решение.
https://github.com/appjs/appjs
На момент написания этой статьи это конечное решение для упаковки приложений node.js через урезанный пакет хрома, скомпилированный в исполняемый файл.
Редактировать: AppJS больше не активен, но сам по себе предлагает форк под названием deskshell.
Не пробовал, но nexe выглядит так, как будто nexe может сделать это:
Здесь есть много хороших ответов, но они не так просты, как JXcore.
После установки JXcore в Windows все, что вам нужно сделать, это запустить:
jx package app.js "myAppName" -native
Это создаст.exe-файл, который вы можете распространять и который можно выполнять без каких-либо внешних зависимостей (вам даже не нужны ни JXcore, ни Node.js в системе).
Вот документация по этой функциональности: http://jxcore.com/packaging-code-protection/
Изменить 2018
Этот проект сейчас мертв, но он по-прежнему размещен здесь: https://github.com/jxcore/jxcore-release (спасибо @Elmue)
Я использовал нижеприведенную технологию:
- @vercel / ncc (убедитесь, что мы собрали все необходимые зависимости в один файл)
- pkg (это для создания exe-файла)
Давайте сделаем ниже:
нпм я -g @ vercel / ncc
ncc build app.ts -o dist (мой входной файл - app.ts, вывод находится в папке dist, убедитесь, что вы работаете в папке, где находятся package.json и app.ts, после выполнения выше вы можете увидеть файл index.js в папке dist)
npm install -g pkg(установка пакета)
pkg index.js(убедитесь, что вы находитесь в папке dist выше)
Пытаться disclose
: https://github.com/pmq20/disclose
disclose
по сути делает самораспаковывающийся exe-файл из вашего проекта Node.js и интерпретатора Node.js со следующими характеристиками:
Нет графического интерфейса Чистый CLI.Нет зависимостей во время выполненияПоддерживает как Windows, так и UnixЗапускается медленно в первый раз (извлекается в каталог кэша), затем быстро навсегда
Пытаться 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 динамически взламывает API-интерфейсы fs.* для доступа к файлам в пакете, тогда как компилятор Node.js оставляет их в покое и вместо этого работает на более глубоком уровне с помощью libsquash. Pkg использует JSON для хранения файлов в пакете, а Node.js Compiler использует более сложную и широко используемую SquashFS в качестве своей структуры данных.
EncloseJS ( http://enclosejs.com/): EncloseJS ограничивает доступ к файлам в пакете только пятью API fs.*, Тогда как компилятор Node.js поддерживает все API fs.*. EncloseJS является частной лицензией и взимает деньги при использовании, в то время как Node.js Compiler имеет лицензию MIT, и пользователи могут свободно использовать его и изменять.
Nexe ( https://github.com/nexe/nexe): Nexe не поддерживает динамическое требование из-за своего использования browserify, тогда как Node.js Compiler поддерживает все виды require, включая 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, при этом без каких-либо специальных требований к ядру.
Попробуйте nexe, который создает один исполняемый файл из ваших приложений node.js
В настоящее время я думаю, что путь - это дено.
Это
deno compile mainProgram.js
Существующие проекты узлов могут нуждаться в некотором преобразовании, по крайней мере, для операторов запроса (преобразование проектов узлов в deno)
Я рекомендую вам 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()
Больше информации:
Просто примечание: обычно я рекомендую использовать программное обеспечение с открытым исходным кодом / бесплатное программное обеспечение, но в этом случае я не нашел ничего, что могло бы сделать работу.
Я обнаружил, что любое из этих решений отвечает моим требованиям, поэтому сделал свою собственную версию узла под названием node2exe, которая делает это. Это доступно от https://github.com/areve/node2exe
Я изучал эту тему в течение нескольких дней, и вот что я нашел. Варианты делятся на две категории:
Если вы хотите создать настольное приложение, лучшие варианты:
1- NW.js: позволяет вызывать все модули Node.js напрямую из DOM и предоставляет новый способ написания приложений со всеми веб-технологиями.
2- Electron: создание кроссплатформенных настольных приложений с использованием JavaScript, HTML и CSS
Вот хорошее сравнение между ними: NW.js & Electron Compared. Я думаю, что NW.js лучше, и он также предоставляет приложение для компиляции файлов JS. Есть также несколько автономных сборщиков исполняемых файлов и инсталляторов, таких как Enigma Virtual Box. Они оба содержат встроенную версию Chrome, которая не нужна для серверных приложений.
если вы хотите упаковать серверное приложение, это лучшие варианты:
node-compiler: Компилятор с опережением времени (AOT), разработанный для Node.js, который просто работает.
Nexe: создайте один исполняемый файл из ваших приложений node.js
Я считаю, что в этой категории лучше работает компилятор узлов, который поддерживает динамические модули require и собственные модули узлов. Он очень прост в использовании, и его выход начинается с 25 МБ. Полное сравнение с другими решениями вы можете прочитать на странице Node Compiler. Я не слишком много читал о Nexe, но сейчас, похоже, Node Compiler не компилирует файл js в двоичный формат с помощью функции моментальных снимков V8, но он запланирован для версии 2. У него также будет встроенный установщик установщика.
Немного опоздал, но, основываясь на ответе, я написал краткое сообщение с практическими рекомендациями, используя Advanced" Batch To EXE Converter".
http://www.alexjamesbrown.com/development/create-a-standalone-exe-to-run-a-node-js-application/
Может быть много других вариантов, но, насколько мне известно, есть один проект в активной разработке на GitHub https://github.com/zeit/pkg. Вы можете играть с этим. Еще один на https://github.com/nexe/nexe но не в активной разработке.
Надоело начинать на win из командной строки, потом я тоже наткнулся на это. Слегка улучшенная версия над чем josh3736. Это использует файл XML, чтобы получить несколько настроек. Например, путь к Node.exe
а также файл для запуска в стандартном app.js. Также среда для загрузки (production, dev и т. Д.), Которую вы указали в своем app.js (или server.js или как вы там его называли). По сути это добавляет NODE_ENV={0}
где {0} - это имя вашей конфигурации в app.js как переменная для вас. Вы делаете это, изменяя элемент "mode" в 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);
}
Если у вас установлен Node.js 20 или 19.7.0, v18.16.0, вы можете создать файл .exe, используя экспериментальную функцию одного исполняемого приложения . Он также может создавать двоичные файлы, которые могут работать на Mac и Linux. Как уже упоминалось, это экспериментальный вариант, поэтому в него могут быть внесены изменения.
Существует проект инструмента сборки с открытым исходным кодом, называемый nodebob. Я предполагаю, что рабочие платформы Windows,
- просто клонировать или скачать проект
- Скопируйте все свои файлы проекта node-webkit в папку приложения.
- запустите скрипт build.bat.
Вы найдете исполняемый файл в папке релиза.
Примечание: вам также понадобятся python и pip (или easy_install), чтобы это работало.
Создайте виртуальную среду узла с помощью nodeenv (установите с помощью
python -m pip install nodeenv
) (сделать, используя
python -m nodeenv envname
)
Создайте файл .bat, запускающий код, используя exe-файл виртуальной среды узла (хранящийся в
./envname/Scripts/node.exe
), затем используйте какой-нибудь конвертер bat в exe (http://www.battoexeconverter.com/ ). idk затем распространите все файлы, кроме файла bat, вместо этого используйте преобразованный файл exe, превратив их в установщик с помощью какой-либо программы. Вот и все.
Один из способов сделать это — опубликовать свой код как модуль NPM и предоставить NPM файл bin в package.json с"bin": "app.js"
1
Чтобы пользователи могли установить ваш интерфейс командной строки, им необходимо установить и запустить узел.npm i -g [packageName]
(-g для глобального)
этот ответ очень прост, но имеет недостаток, заключающийся в необходимости установки узла.
Если вы хотите, чтобы ваше приложение на самом деле было исполняемым файлом без помощи узла или NPM, я бы рекомендовал nexe