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

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

node.exe app.js inputArg

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

App.exe inputArg

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

App.bat inputArg

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

22 ответа

Решение

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

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

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

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

Решением, которое я использовал, является нод-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 и через Интернет.

Для тех, кто наткнулся на этот вопрос, теперь есть два проекта, которые создают exes из ваших проектов узлов, EncloseJS и http://electron.atom.io/, они немного отличаются:

  1. EncloseJS скомпилирует ваш проект в нативный код, они также включают ресурсы и установку nodejs (системе не нужно устанавливать nodejs для выполнения.exe). Ваш исходный код не будет включен. Получающийся исполняемый файл - ТОЛЬКО для Windows (.exe). Все платформы поддерживаются. Теперь требуется лицензия на коммерческие продукты.
  2. 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.

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

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

https://github.com/crcn/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)

Я использовал нижеприведенную технологию:

  1. @vercel / ncc (убедитесь, что мы собрали все необходимые зависимости в один файл)
  2. pkg (это для создания exe-файла)

Давайте сделаем ниже:

  1. нпм я -g @ vercel / ncc

  2. ncc build app.ts -o dist (мой входной файл - app.ts, вывод находится в папке dist, убедитесь, что вы работаете в папке, где находятся package.json и app.ts, после выполнения выше вы можете увидеть файл index.js в папке dist)

  3. npm install -g pkg(установка пакета)

  4. pkg index.js(убедитесь, что вы находитесь в папке dist выше)

Пытаться 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 динамически взламывает 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

https://github.com/nexe/nexe

В настоящее время я думаю, что путь - это дено.

Это

      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,

  1. просто клонировать или скачать проект
  2. Скопируйте все свои файлы проекта node-webkit в папку приложения.
  3. запустите скрипт 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

Другие вопросы по тегам