Як зробити файли exe з програми node.js?


123

У мене є додаток для вузла, який я написав, що я запускаю так:

node.exe app.js inputArg

Чи є якийсь спосіб я сам упакувати це в .exe? Тож я просто можу зробити щось подібне?

App.exe inputArg

У мене є спосіб підробити це за допомогою пакетного файлу, тому я можу це зробити:

App.bat inputArg

Але для цього потрібно, щоб у мене були всі залежності і вузол у цій папці, що не ідеально.




Список добре інструментів тут: stackoverflow.com/a/12486874/32679
GrGr

1
Я думаю, що кожен, хто додає відповідь тут, дійсно повинен врахувати, чи це вже було зроблено. Це питання перетворюється на купу посилань на різні продукти з відкритим кодом різної якості / активності.
Ліам

Відповіді:


35

Є кілька альтернатив, як безкоштовних, так і комерційних. Я не використовував жодного з них, але теоретично вони повинні працювати:

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

Залежно від вашого сценарію, у вас також є можливість перенести його в JSDB , який підтримує простий спосіб створення виконуваних файлів , просто додаючи до нього ресурси.

Третє квазірозв’язання - зберегти вузол десь як C:\utilsі додати цю папку до PATHзмінної середовища. Тоді ви можете створити .bat файли в тому режимі, у якому працює вузол + ваші уподобані сценарії - я отримав coffeescript, який coffeeпрацює над Windows таким чином. Ця установка може бути автоматизована за допомогою пакетного файлу, vb скрипту або інсталятора.


Вони добре виглядають і схожі на те, що вони можуть робити те, що я хочу від них. Я дам йому постріл і повернусь до вас.
Aishwar

2
Я спробував "Advanced" Batch To EXE конвертер, і він спрацював як шарм. Ви можете упакувати залежності у файл EXE. Дякую за допомогу.
Aishwar

1
@Aishwar, але ви не можете зв’язати папку node_modules, тому ви не можете зробити нічого просунутого в ній ...
Клінт

Що робити, якщо ви zip / rar node_modules та витягаєте в тимчасовий каталог під час запуску програми? Хоча ви можете трохи повільніше, якщо у вас багато модулів.
Jarrod Mosen

55

Я використовував рішення - вузол-webkit Роджера Ванга .

Це фантастичний спосіб упаковки додатків nodejs та їх розповсюдження, він навіть дає вам можливість «зв’язати» весь додаток як єдиний виконуваний файл. Він підтримує windows, mac та linux.

Ось декілька документів про різні варіанти розгортання додатків node-webkit, але в двох словах, ви робите наступне:

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

Як додана примітка - я поставив кілька виробничих короб / програм CD, використовуючи це, і це спрацювало чудово. Цей же додаток працює у Windows, Mac, Linux та в Інтернеті.

Оновлення: назва проекту змінено на 'nw.js' і тут правильно розміщено: nw.js


1
Просто спробував, працював чудово! І це підтримують люди Intel.
Тімо Хуовінен

Це має бути правильною і найсучаснішою відповіддю на сьогодні. Дивіться також чіт-лист веб-версії вузла тут: gist.github.com/LeCoupa/80eca2716a2b13c37cce Включає в себе інші дуже корисні речі, як, наприклад, як скласти JS (або принаймні стискати до байтового коду залежно від того, наскільки старомодно ви хочете бути про слово "компілювати").
Ерік Реппен

Мені подобається ця відповідь, однак це все ще не створює автономного exe. За даними Intel та nw.js у Github, вам все одно потрібно мати принаймні два інші файли в одній папці: nw.pak та icudt.dll. Як створити автономний екзе?
Джефф Бейкер

@JeffBaker, якщо трохи поглянути в документи на github, ви можете побачити це: github.com/nwjs/nw.js/wiki/…, що ви можете зробити, якщо вам не потрібно включати додаткові файли.
Клейтон Гулік

@Clayton, Nw.js також використовується chrome.com. developer.chrome.com/apps/migration#native
Pacerier

29

Для тих, хто стикається з цим питанням, зараз є два проекти, які створюють exe з ваших проектів вузлів, Pkg та Electron.atom.io , вони незначно відрізняються:

  1. Pkg буде компілювати ваш проект до нативного коду, вони також включають активи та установку nodejs (для виконання файлу .exe системі не потрібно буде встановлювати nodejs). Ваш вихідний код не буде включений. Отриманий виконуваний файл - ТІЛЬКИ Windows (.exe). Зараз усі платформи підтримуються. Тепер він вимагає ліцензії на комерційну продукцію. Повністю відкритий код.
  2. Хоча Electron.atom.io не буде компактним і генерує .exe для вас, він МОЖЕ бути використаний для розповсюдження програм nodejs, оскільки вони пропонують спосіб поширення програм . Переваги полягають у тому, що електрон є багатоплатформенним (windows, mac osx, linux), а мінуси полягають у тому, що ваш вихідний код буде включений, навіть якщо вони пропонують спосіб розповсюдження вашого додатка в архіві asar . Це не буде куленепроникним, але все-таки краще, ніж ваш джерело на простоті.

2
Оновіть: EncloseJS тепер підтримує Linux та OS X.
000000000000000000000

Відредагований коментар! @ 000000000000000000000
sokie

EncloseJS - це шлях. Я зараз буду пробувати це! Дякуємо, що додали свою відповідь! +1 :)
tftd

Я не можу встановити EncloseJS. Він говорить про помилку коду ELIFECYCLE без корисного повідомлення про помилку.
Елмуе

2
EncloseJS вже не підтримується. Схоже, спадкоємцем є zeit / pkg ( npmjs.com/package/pkg )
Лукас Гонзе,

21

За замовчуванням Windows асоціює .jsфайли з хостом сценаріїв Windows , автономним механізмом виконання 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, якщо потрапити в мікроавтобуси з незнайомцями - це ваша справа.


Як ви вже згадували, це не вирішує мою проблему ідеально. Але +1 для цікавих читань
Aishwar

@Aishwar, я додав простий додаток, який запустить Node для вас. Див. Правки.
josh3736

@ josh3736 чи вимагає ваш exe, щоб у вас була node.exe в тій же папці?
Рікардо Томасі

@RicardoTomasi, ні. Він передбачає, що Node встановлений у каталозі програмних файлів вашої системи (куди він розміщує програму установки).
josh3736

@ josh3736 Це цікаве рішення. Мені подобається те, що ти зробив, хотілося б, щоб я міг ще +1 :). Але це все ще не ідеально, оскільки це вимагає від користувача встановити node.js і в стандартному шляху.
Aishwar

20

Найкращий інструмент, який я знаю, - це інструмент NodeJS: zeit / pkg

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

для створення виконавчих файлів для macOS, Linux та Windows:

pkg exampleApp.js

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


Я спробував ущільнити установку Appium у файл Exe, і zeit / pkg повністю не вдалося. З 310 Мб на диску вийшов невеликий файл Exe розміром 18 МБ, який, очевидно, зовсім не працював.
Елмуе


12

Після того, як на це питання було дано відповідь, було розпочато ще одне рішення.

https://github.com/appjs/appjs

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

Редагувати: AppJS більше не активний, але сам пропонує вилку, яку називають deskshell.

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


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)


1
Дякую, друже. Чи можу я виконати виконуваний Linux з Windows?
Сасіварнан

1
Наскільки я знаю, ні, ви не можете. Я думаю, що JXCore захоплює деякі файли з ОС, щоб зробити виконуваний файл, і він не пакує ці файли, тому якщо ви хочете зробити Linux виконуваним, вам доведеться запустити цю команду в Linux.
Nepoxx


1
Усі посилання тут мертві. Це працює: github.com/jxcore/jxcore-release
Elmue

7

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

disclose по суті робить самостійно витягує exe з вашого проекту Node.js та інтерпретатора Node.js з такими характеристиками,

  1. Немає GUI. Чистий 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, тоді як Node.js Compiler підтримує всі файли API. EncloseJS є власником ліцензії і стягує гроші при використанні, поки Node.js Compiler має ліцензію на MIT, і користувачі можуть вільно користуватися ним та вільно змінювати їх.

  • Nexe ( https://github.com/nexe/nexe ): Nexe не підтримує динамічну потребу через використання браузера, тоді як Node.js Compiler підтримує всі види вимагань, включаючи Require.resolve.

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

  • AppImage ( http://appimage.org/ ): AppImage підтримує лише Linux з ядром, яке підтримує SquashFS, тоді як Node.js Compiler підтримує всі три платформи Linux, macOS та Windows, тим часом без особливих вимог до функції ядра.


@ StéphaneLaurent Перевірте компілятор вузлів, він, безумовно, підтримує використання аргументу командного рядка з exe.
Пан Minqi

Останній комітет 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

Я кілька днів досліджував цю тему, і ось що я знайшов. Варіанти поділяються на дві категорії:

Якщо ви хочете створити настільний додаток, найкращі варіанти:

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

2- Electron : Створіть настільні програми для настільних платформ із JavaScript, HTML та CSS

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

якщо ви хочете упакувати серверну програму, це найкращі варіанти:

node-компілятор : Попередній (AOT) компілятор, призначений для Node.js, який просто працює.

Nexe : створити єдиний виконуваний файл із своїх програм node.js

У цій категорії я вважаю, що компілятор вузлів є кращим, який підтримує динамічні модулі вимагають і рідні вузли. Це дуже просто у використанні, і вихід починається з 25 Мб. Ви можете прочитати повне порівняння з іншими рішеннями на сторінці Node Compiler. Я не багато читав про Nexe, але наразі, схоже, Node Compiler не компілює js-файл у бінарний формат за допомогою функції знімка V8, але планується для версії 2. Також він матиме вбудований інсталятор інсталятора.


2
Electronне виправдовує чинність пропозиції щодо ОП; це ціла інша рамка вузла.
progyammer

Чудове порівняння!
Влад


1

Набридло починати вигравати з командного рядка, і тоді я перебіг це також. Трохи вдосконалений вер. над чим josh3736 . Для використання цього файлу XML використовується декілька налаштувань. Наприклад, шлях до Node.exeфайлу та файл, який потрібно запустити у програмі app.js за замовчуванням. Також середовище для завантаження (виробництво, розробник тощо), яке ви вказали у своєму 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);
        }


0

Існує проект інструменту збирання відкритих ресурсів під назвою nodebob . Я припускаю, що робочі вікна платформи,

  1. просто клонуйте або завантажте проект
  2. скопіюйте всі ваші файли проекту node-webkit у папку додатків.
  3. запустіть сценарій build.bat.

Ви знайдете виконуваний файл всередині папки випуску.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.