如何从一个Node.js应用程序的EXE文件?
我有一个我写的节点应用程序,我运行如下:
node.exe app.js inputArg
有什么办法可以将它打包到一个.exe本身? 所以我可以做这样的事情?
App.exe inputArg
我有一些方法通过使用batch file来伪造,所以我可以这样做:
App.bat inputArg
但是这需要我拥有该文件夹中的所有依赖项和节点,这并不理想。
有几个select,无论是自由和商业。 我没有使用过它们,但理论上它们应该工作:
- Iexpress(原生Windows工具)
- 快速批量文件编译器 (商业)
- “高级”批处理EXE转换器“ (免费)
大多数需要您将batch file保存为主可执行文件,然后捆绑node.exe和您的脚本。
根据您的脚本,您也可以select将其移植到JSDB ,该脚本支持通过简单地向其添加资源来创build可执行文件的简单方法 。
第三个准解决scheme是将节点保存在C:\utils
,并将此文件夹添加到PATH
环境variables中。 然后,你可以在那个运行node +你的首选脚本的目录下创build.bat文件 – 这样我就可以在windows上获得coffeescript的coffee
。 这个设置可以通过batch file,vb脚本或安装程序自动完成。
我使用的解决scheme是Roger Wang的node-webkit 。
这是打包nodejs应用程序并分发它们的一个很好的方法,甚至可以让您select将整个应用程序“捆绑”为单个可执行文件。 它支持Windows,Mac和Linux。
以下是关于部署node-webkit应用程序的各种选项的一些文档,但简而言之,您可以执行以下操作:
- 压缩所有的文件,在根目录下有一个package.json文件
- 将扩展名从.zip更改为.nw
- 复制/ b nw.exe + app.nw app.exe
正如一个附加说明 – 我已经运出了几个生产盒/安装光盘应用程序使用它,它的工作很好。 相同的应用程序运行在Windows,Mac,Linux和networking上。
对于任何人都在这个问题上磕磕绊绊,现在有两个项目创build了你的节点项目, EncloseJS和Electron.atom.io ,他们略有不同:
- EncloseJS会将您的项目编译为本地代码,它们还包括资源和nodejs安装(系统不需要安装nodejs来执行.exe)。 您的源代码将不会被包括在内。
生成的可执行文件是Windows ONLY(.exe)。现在所有平台都受支持。 现在它需要商业产品的许可证。 - Electron.atom.io,虽然它不会压缩并为您生成.exe,它可以用来分发nodejs应用程序,因为它们提供了一种分配应用程序的方式。 好处是电子是多平台的(windows,mac osx,linux),缺点是你的源代码将被包括在内,甚至很难提供一种方法来将你的应用程序分布在一个asar文档中。 这不会是防弹的,但它仍然比你的来源更好。
默认情况下,Windows将.js
文件与Windows脚本宿主 ,微软的独立JS运行时引擎关联起来。 如果在命令提示符下键入script.js (或者双击Explorer中的.js
文件),脚本将由wscript.exe
执行。
这可能是用全局设置来解决本地问题 ,但是可以将.js
文件与node.exe
关联 node.exe
,以便在命令提示符处键入script.js ,或者双击/拖动项目到脚本中,都可以使用Node启动它们。
当然,如果像我一样,你已经把一个.js
文件和一个编辑器关联起来,双击它们就可以打开你最喜欢的文本编辑器,但是这个build议不会有什么好处。 您也可以在 “ .js
文件中添加一个右键单击菜单项 “Execute with Node”,尽pipe这个select并不能解决您的命令行需求。
最简单的解决scheme可能只是使用batch file – 您不必在脚本所在的文件夹中拥有Node的副本,只需完全引用Node可执行文件即可:
"C:\Program Files (x86)\nodejs\node.exe" app.js %*
另一种select是这个非常简单的C#应用程序,它将启动节点使用自己的文件名+ .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 ...
和节点将开始与命令行"app.js" arg1 ...
请注意,C#bootstrapper应用程序将立即退出,从而使Node负责控制台窗口。
由于这可能是相对广泛的利益,我继续前进,并在GitHub上提供 ,包括编译的EXE,如果与陌生人进入货车是你的事情。
由于这个问题已经得到解答,另一个解决scheme已经启动。
https://github.com/appjs/appjs
在写这篇文章的时候,这是通过一个剥离下来的铬包编译成可执行文件来打包node.js应用程序的最终解决scheme。
编辑:AppJS不再活动,但本身build议一个叫做deskshell的叉子。
还没有尝试过,但nexe看起来像nexe可以做到这一点:
这里有很多很好的答案,但是并不像JXcore那么简单。
一旦你在Windows上安装了JXcore,你只需要运行:
jx package app.js "myAppName" -native
这将生成一个.exe文件,您可以分发,并且可以在没有任何外部依赖的情况下执行(您甚至不需要系统上的JXcore和Node.js)。
以下是关于该function的文档: http : //jxcore.com/packaging-code-protection/#cat-74
有点晚了,但基于这个答案 ,我创build了一个快速的“如何”的博客文章,使用先进的“批量EXE转换器
http://www.alexjamesbrown.com/development/create-a-standalone-exe-to-run-a-node-js-application/
我发现这些解决scheme中的任何一个都满足了我的要求,所以制作了我自己的名为node2exe的节点。 它可以从https://github.com/areve/node2exe获得;
我向你推荐BoxedApp。 这是一个工作得很好的商业产品。 它适用于任何NodeJS应用程序。 最终用户只会为您的应用程序获取一个EXE文件。 无需安装。
例如,在Electron中,最终用户需要安装/解压缩应用程序,他将看到代码的所有源文件。
BoxedApp它打包了NodeJS应用程序需要的所有文件和依赖关系。 它支持压缩,并且编译的文件在Windows XP +上工作
当您使用它时,一定要将Node.EXE添加到编译的应用程序。 select一个支持Windows XP的节点版本(如果你需要的话)
该程序支持命令行参数,所以封装后,你可以做
c:\myApp argument1
你可以在你的节点代码中获得参数:
process.argv[1]
有时您的应用程序具有文件依赖性,因此BoxedApp中可以添加任何文件夹和文件作为依赖项,例如,您可以插入一个设置文件。
var mySettings=require('fs').readFileSync('./settings.jgon').toString()
更多信息:
- 公司
- 该产品
- 下载试用版
只是一个说明:通常我会推荐关于开源/免费软件,但在这种情况下,我没有find任何工作完成。
尝试disclose
: https : //github.com/pmq20/disclose
disclose
本质上是一个自我解压缩的EXE出你的Node.js项目和Node.js解释器具有以下特点,
没有GUI。 纯CLI。没有运行时的依赖关系支持Windows和Unix第一次运行缓慢(提取到caching目录),然后永远快速运行
尝试node-compiler
: https : //github.com/pmq20/node-compiler
我做了一个名为node-compiler
的新项目来将你的Node.js项目编译成一个可执行文件。
它比第一次运行缓慢,因为你的源代码和Node.js解释器一起编译,就像标准的Node.js库一样。
此外,它将文件和目录请求透明地redirect到内存,而不是在运行时redirect到文件系统。 所以不需要源代码来运行编译的产品。
它是如何工作的: 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 hacked fs。* APIdynamic地访问包内文件,而Node.js编译器将它们留在一边,而是通过libsquash在更深层次上工作。 Pkg使用JSON来存储包内文件,而Node.js编译器使用更复杂和广泛使用的SquashFS作为其数据结构。
-
EncloseJS( http://enclosejs.com/ ):EncloseJS将包内文件的访问权限限制为5个fs * API,而Node.js编译器则支持所有fs。* API。 EncloseJS是专有许可的,在使用Node.js编译器的时候会收取费用,而且用户可以免费使用它并免费修改它。
-
Nexe( https://github.com/nexe/nexe ):由于使用了browserify,Nexe不支持dynamic需求,而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只支持内核支持SquashFS的Linux,而Node.js编译器支持Linux,macOS和Windows的所有三个平台,同时没有任何内核的特殊要求。
厌倦了从命令提示符开始获胜,然后我碰到了这个。 稍微改进版本 在什么josh3736 。 这使用一个XML文件来抓取一些设置。 例如, Node.exe
的path以及在默认app.js中启动的文件。 此外,您的app.js(或server.js或任何你所说的)指定的加载(生产,开发等)的环境。 从本质上讲,它添加了NODE_ENV={0}
,其中{0}是app.js中configuration的名称,作为一个var。 您可以通过修改config.xml中的“mode”元素来完成此操作。 你可以在这里抓住这个项目==> github 。 在Post Build事件中注意,你可以修改复制path来自动将你的config.xml和可执行文件复制到你的Nodejs
目录,只是为了保存一个步骤。 否则,编辑这些,否则你的构build会发出警告。
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); }
可能有很多其他的select,但据我所知,在GitHub https://github.com/zeit/pkg上有一个正在开发的项目。; 你可以玩它。 还有一个在https://github.com/nexe/nexe,但没有积极的开发。;
有几天我一直在探讨这个话题,这是我发现的。 期权分为两类:
如果你想build立一个桌面应用程序,最好的select是:
1- NW.js :让您直接从DOM调用所有Node.js模块,并启用一种用所有Web技术编写应用程序的新方法。
2- 电子 :使用JavaScript,HTML和CSS构build跨平台桌面应用程序
这是一个很好的比较: NW.js和电子比较 。 我认为NW.js更好,它也提供了一个应用程序来编译JS文件。 也有一些独立的可执行和安装程序的build设者,如Enigma虚拟盒 。 他们都包含Chrome的embedded式版本,这是服务器应用程序不必要的。
如果你想打包一个服务器应用程序这些是最好的select:
节点编译器 :为Node.jsdevise的前期(AOT)编译器,正常工作。
Nexe :从您的node.js应用程序中创build一个可执行文件
在这个类别中,我相信node-compiler更好,它支持dynamicrequire和native节点模块。 使用起来非常简单,输出从25MB开始。 您可以在“节点编译器”页面中阅读与其他解决scheme的完整比较。 我没有读到关于Nexe的很多内容,但现在看来Node编译器似乎并没有使用V8快照function将js文件编译为二进制格式,而是计划在版本2中使用。它还将具有内置的安装程序构build器。
试试从你的node.js应用程序创build一个单一的可执行文件的nexe
我所知道的最好的工具是NodeJS工具: zeit / pkg
它非常易于使用(比Nexe更多,只是作为一个例子),你可以在全局npm install -g pkg
: npm install -g pkg
为macOS,Linux和Windows创build可执行文件:
pkg exampleApp.js
我有一些复杂的代码使用NodeJS套接字服务器,我尝试了不同的应用程序,没有一个创build它,除了zeit / pkg 。
有一个名为nodebob的开源构build工具项目。 我假设工作平台的窗口,
- 只需克隆或下载项目
- 将你的所有node-webkit项目文件复制到app文件夹中。
- 运行build.bat脚本。
您将在发布文件夹中find可执行文件。