我有一个我写的节点应用程序,运行如下:
node.exe app.js inputArg
有什么方法可以将它自己打包成.exe吗?所以我可以做这样的事情吗?
App.exe inputArg
我有一些方法可以通过使用批处理文件来伪造它,所以我可以这样做:
App.bat inputArg
但这需要我拥有该文件夹中的所有依赖项和节点,这并不理想。
答案 0 :(得分:47)
我使用的解决方案是Roger Wang的node-webkit。
这是打包nodejs应用程序并分发它们的绝佳方式,它甚至可以让您将整个应用程序“捆绑”为单个可执行文件。它支持windows,mac和linux。
Here是关于部署node-webkit应用程序的各种选项的一些文档,但简而言之,您执行以下操作:
正如一个补充说明 - 我已经使用它发运了几个生产盒/安装CD应用程序,并且它运行良好。相同的应用程序在Windows,Mac,Linux和网络上运行。
答案 1 :(得分:30)
有一些替代品,包括免费和商业。我没有使用它们,但理论上它们应该起作用:
大多数都要求您将批处理文件保留为主可执行文件,然后捆绑node.exe和脚本。
根据您的脚本,您还可以选择将其移至JSDB,只需向其添加资源即可支持easy way to create executables。
第三个准解决方案是将节点保留在C:\utils
之类的某个位置,并将此文件夹添加到PATH
环境变量中。然后你可以在那个运行节点+你喜欢的脚本的目录中创建.bat文件 - 我通过这种方式让coffeescript的coffee
在windows上工作。可以使用批处理文件,vb脚本或安装程序自动执行此设置。
答案 2 :(得分:25)
对于任何绊倒这个问题的人来说,现在有两个项目可以从您的节点项目Pkg和Electron.atom.io创建exes,它们略有不同:
答案 3 :(得分:22)
默认情况下,Windows将.js
个文件与Microsoft Windows Script Host独立的JS运行时引擎相关联。如果在命令提示符下键入 script.js (或双击资源管理器中的.js
文件),脚本将由wscript.exe
执行。
这可能是solving a local problem with a global setting,但您可以使用.js
代替associate node.exe
个文件,以便在命令中键入 script.js 提示或双击/拖动项目到脚本将使用Node启动它们。
当然,如果 - 像我一样 - 您已将.js
个文件与编辑器相关联,以便双击它们可以打开您喜欢的文本编辑器,这个建议不会有多大好处。您还可以{"执行节点&#34} add a right-click menu entry到.js
个文件,虽然这个替代方案并不能解决您的命令行需求。
最简单的解决方案可能只是使用批处理文件 - 您不必在脚本所在的文件夹中包含Node的副本。只需完全引用Node可执行文件:
"C:\Program Files (x86)\nodejs\node.exe" app.js %*
另一个替代方案是这个非常简单的C#应用程序,它将使用自己的文件名+ .js
作为要运行的脚本启动Node,并传递任何命令行参数。
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 ...
启动Node。请注意,C#bootstrapper应用程序将立即退出,让Node负责控制台窗口。
由于这可能是相对广泛的兴趣,我继续做了这个available on GitHub,包括compiled exe如果与陌生人一起进入货车是你的事。
答案 4 :(得分:14)
我所知道的最好的工具是NodeJS工具:zeit/pkg
它非常易于使用(比Nexe更多,仅作为示例),您可以全局安装:
npm install -g pkg
为macOS,Linux和Windows创建可执行文件:
pkg exampleApp.js
我有一些使用NodeJS套接字服务器的复杂代码,我尝试了不同的应用程序,除了 zeit / pkg 之外,没有一个正确创建它。
答案 5 :(得分:12)
由于这个问题已得到解答,另一个解决方案已经启动。
https://github.com/appjs/appjs
在撰写本文时,这是通过编译成可执行文件的精简铬包打包node.js应用程序的最终解决方案。
编辑: AppJS不再活跃,但它本身就建议使用一个名为deskshell的分支。
答案 6 :(得分:11)
这里有很多好的答案,但它们并不像JXcore那样简单。
在Windows上安装JXcore后,您只需运行:
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)
答案 7 :(得分:10)
Haven没试过,但是nexe看起来像nexe可以做到这一点:
答案 8 :(得分:4)
尝试 disclose
:https://github.com/pmq20/disclose
disclose
本质上是从Node.js项目和Node.js解释器中生成一个具有以下特征的自解压exe,
试试node-compiler
:https://github.com/pmq20/node-compiler
我创建了一个名为node-compiler
的新项目,将Node.js项目编译为一个可执行文件。
它优于disclose
,因为它首次从未缓慢运行,因为您的源代码与Node.js解释器一起编译,就像标准的Node.js库一样。
此外,它将文件和目录请求透明地重定向到内存而不是在运行时重定向到文件系统。因此,运行已编译的产品不需要任何源代码。
与类似项目比较,
pkg(https://github.com/zeit/pkg):Pkg动态地攻击fs。* API以访问包内文件,而Node.js编译器则将它们单独留下,而是在更深层次上工作通过libsquash。 Pkg使用JSON存储包内文件,而Node.js编译器使用更复杂和广泛使用的SquashFS作为其数据结构。
EncloseJS(http://enclosejs.com/):EncloseJS将对包内文件的访问限制为仅仅五个fs。* API,而Node.js编译器支持所有fs。* API' s 。 EncloseJS是专有许可,在使用时收取费用,而Node.js编译器是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仅支持具有支持SquashFS的内核的Linux,而Node.js编译器支持Linux,macOS和Windows的所有三个平台,同时没有任何特殊要求。内核。
答案 9 :(得分: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()
更多信息:
只是注意:通常我推荐开源/免费软件,但在这种情况下,我没有找到任何可以完成工作的东西。
答案 10 :(得分:3)
我确实发现这些解决方案中的任何一个都符合我的要求,所以我自己创建了一个名为node2exe的节点版本来实现这一点。它来自https://github.com/areve/node2exe
答案 11 :(得分:1)
厌倦了从命令提示符开始win,然后我也遇到了这个问题。略有改进的版本。什么 josh3736 。这使用XML文件来获取一些设置。例如,Node.exe
的路径以及默认app.js中要启动的文件。还有你在app.js(或者server.js或你称之为的任何东西)中指定的加载环境(生产,开发等)。基本上它添加了NODE_ENV={0}
,其中{0}是app.js中配置的名称,作为var。您可以通过修改config.xml中的“mode”元素来完成此操作。你可以在这里抓住项目==> 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);
}
答案 12 :(得分:1)
可能还有很多其他选择,但据我所知,GitHub上有一个正在积极开发的项目https://github.com/zeit/pkg。你可以玩它。 还有一个在https://github.com/nexe/nexe,但没有积极开发。
答案 13 :(得分:1)
我已经探索了这个话题了好几天,这就是我找到的。选项分为两类:
如果您想构建桌面应用,最佳选择是:
1- NW.js:允许您直接从DOM调用所有Node.js模块,并启用一种使用所有Web技术编写应用程序的新方法。
2- Electron:使用JavaScript,HTML和CSS构建跨平台桌面应用
以下是他们之间的良好比较:NW.js & Electron Compared。我认为NW.js更好,它还提供了编译JS文件的应用程序。还有一些独立的可执行文件和安装程序构建器,如Enigma Virtual Box。它们都包含嵌入式Chrome版本,这对于服务器应用程序来说是不必要的。
如果要打包服务器应用,这些是最佳选择:
node-compiler:为Node.js设计的Ahead-of-Time(AOT)编译器,它可以正常工作。
Nexe:从您的node.js应用
创建一个可执行文件
在这个类别中,我相信节点编译器更好,它支持动态需求和本机节点模块。它非常易于使用,输出起始于25MB。您可以在“节点编译器”页面中阅读与其他解决方案的完整比较。我没有读过很多关于Nexe的内容,但是现在看来Node编译器并没有使用V8快照功能将js文件编译为二进制格式,但它计划用于版本2.它还将具有内置的安装程序构建器。 / p>
答案 14 :(得分:1)
尝试使用nexe从node.js应用程序中创建单个可执行文件
答案 15 :(得分:0)
有一个名为nodebob的开源构建工具项目。 我假设工作平台窗口,
您将在release文件夹中找到可执行文件。
答案 16 :(得分:0)
我正在使用以下技术:
请执行以下操作
npm i -g @ vercel / ncc
ncc构建app.ts -o dist (我的输入文件是app.ts,输出在dist文件夹中,请确保您在 package.json和app.ts所在的文件夹中运行 ,在上面运行请参阅文件夹dist中的index.js文件
npm install -g pkg (正在安装pkg)
pkg index.js (确保您位于上面的dist文件夹中)