我有一个编写的节点应用程序,运行如下:
node.exe app.js inputArg
有什么办法可以将其本身打包为.exe?所以我可以做这样的事情吗?
App.exe inputArg
我可以通过使用批处理文件来伪造此方法,因此可以执行以下操作:
App.bat inputArg
但这要求我在该文件夹中拥有所有依赖项和节点,这并不理想。
我有一个编写的节点应用程序,运行如下:
node.exe app.js inputArg
有什么办法可以将其本身打包为.exe?所以我可以做这样的事情吗?
App.exe inputArg
我可以通过使用批处理文件来伪造此方法,因此可以执行以下操作:
App.bat inputArg
但这要求我在该文件夹中拥有所有依赖项和节点,这并不理想。
Answers:
有一些选择,包括免费和商业。我没有使用过它们,但理论上它们应该可以工作:
大多数要求您将批处理文件保留为主要可执行文件,然后将node.exe和脚本捆绑在一起。
根据您的脚本,您还可以选择将其移植到JSDB,这支持通过简单地向其添加资源来创建可执行文件的简便方法。
第三种准解决方案是将节点保留在类似的位置,C:\utils
然后将此文件夹添加到您的PATH
环境变量中。然后,您可以在该目录中创建运行节点+您喜欢的脚本的.bat文件-我coffee
以这种方式使coffeescript 在Windows 上正常工作。可以使用批处理文件,vb脚本或安装程序自动执行此设置。
我使用的解决方案是Roger Wang的node-webkit。
这是打包nodejs应用程序并分发它们的一种绝妙方法,它甚至为您提供了将整个应用程序“捆绑”为单个可执行文件的选项。它支持Windows,Mac和Linux。
以下是一些有关部署节点Webkit应用程序的各种选项的文档,但总而言之,您可以执行以下操作:
就像一个补充说明-我已经使用此工具交付了多个生产盒/安装cd应用程序,并且效果很好。同一应用程序可在Windows,Mac,Linux和Web上运行。
更新:项目名称已更改为“ nw.js”,并且位于以下位置:nw.js
对于遇到这个问题的人,现在有两个项目可以从您的节点项目中创建exe文件,即Pkg和Electron.atom.io,它们略有不同:
默认情况下,Windows将.js
文件与Microsoft的独立JS运行时引擎Windows Script Host关联。如果在命令提示符下键入script.js(或.js
在Explorer中双击一个文件),则脚本由执行wscript.exe
。
这可能是通过全局设置解决了本地问题,但是您可以将文件与之关联 ,以便在命令提示符下键入script.js或双击/将项目拖到脚本上将使用Node启动它们。.js
node.exe
当然,如果像我一样.js
,您已将文件与编辑器相关联,以便双击它们打开您喜欢的文本编辑器,则此建议将无济于事。您也可以在文件中添加一个右键单击菜单项 “使用节点执行” .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 ...
并且Node将通过命令行启动"app.js" arg1 ...
。请注意,C#引导程序将立即退出,由Node负责控制台窗口。
因为这可能引起相对广泛的兴趣,所以我继续在GitHub上提供它,包括编译的exe文件(如果您喜欢与陌生人接触)。
我知道最好的工具是NodeJS工具:zeit / pkg
它非常易于使用(作为示例,它比Nexe要多得多),您可以全局安装:
npm install -g pkg
为macOS,Linux和Windows创建可执行文件:
pkg exampleApp.js
我有一些使用NodeJS套接字服务器的复杂代码,我尝试了其他应用程序,除了zeit / pkg之外,其他应用程序均未正确创建。
还没有尝试过,但是nexe看起来可以执行以下操作:
既然已经回答了这个问题,便推出了另一种解决方案。
https://github.com/appjs/appjs
在撰写本文时,这是通过编译成可执行文件的精简铬包来打包node.js应用程序的最终解决方案。
编辑:AppJS不再处于活动状态,但其本身建议使用一个称为Deskshell的叉子。
这里有很多好的答案,但是它们并不像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)
试试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解释器一起编译的,这比总之更好。
此外,它在运行时将文件和目录请求透明地重定向到内存,而不是文件系统。这样就不需要源代码即可运行已编译的产品。
工作原理: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编译器则将它们保留下来,而是通过libsquash在更深层次上工作。Pkg使用JSON存储打包文件,而Node.js Compiler使用更为复杂和广泛使用的SquashFS作为其数据结构。
EncloseJS(http://enclosejs.com/):EncloseJS将对打包文件的访问限制为仅五个fs。* API,而Node.js Compiler支持所有fs。* API。EncloseJS是专有许可的,使用时收费,而Node.js Compiler是MIT许可的,用户既可以自由使用它,也可以自由修改它。
Nexe(https://github.com/nexe/nexe):Nexe由于使用browserify而不支持动态require,而Node.js Compiler支持包括require.resolve在内的各种需求。
asar(https://github.com/electron/asar):Asar使用JSON存储文件信息,而Node.js编译器使用SquashFS。当Node.js编译器将所有JavaScript源代码与Node.js虚拟机链接在一起并生成单个可执行文件作为最终产品时,Asar会将代码存档和可执行文件分开保存。
AppImage(http://appimage.org/):AppImage仅支持具有支持SquashFS内核的Linux,而Node.js编译器支持Linux,macOS和Windows的所有三个平台,同时对该内核没有任何特殊功能的要求。
我建议您使用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:使您可以直接从DOM调用所有Node.js模块,并提供一种使用所有Web技术编写应用程序的新方式。
2- Electron:使用JavaScript,HTML和CSS构建跨平台的桌面应用程序
这是它们之间的一个很好的比较:NW.js和Electron Compare。我认为NW.js更好,它还提供了一个用于编译JS文件的应用程序。还有一些独立的可执行文件和安装程序构建器,例如Enigma Virtual Box。它们都包含Chrome的嵌入式版本,这对于服务器应用程序是不必要的。
如果要打包服务器应用程序,则以下是最佳选择:
node-compiler:专为Node.js设计的提前(AOT)编译器,可以正常工作。
Nexe:从您的node.js应用程序中创建一个可执行文件
在此类别中,我认为节点编译器更好,它支持动态需求和本机节点模块。它非常易于使用,输出从25MB开始。您可以在Node Compiler页面中阅读与其他解决方案的完整比较。我对Nexe的了解不多,但目前看来,Node Compiler并未使用V8快照功能将js文件编译为二进制格式,但已计划在版本2中使用。它还将具有内置的安装程序生成器。
Electron
没有理由为OP的问题提供有效的建议;它是一个完全不同的Node框架。
尝试使用nexe从您的node.js应用程序创建单个可执行文件
厌倦了从命令提示符处开始赢得胜利,然后我也遇到了这个问题。版本略有改善。关于josh3736。这使用XML文件来获取一些设置。例如Node.exe
,默认app.js中的路径以及要启动的文件。也是您在app.js(或server.js或您所谓的名称)中指定的要加载(生产,开发等)的环境。本质上,它NODE_ENV={0}
在app.js中添加{0}是您的配置名称,作为您的变量。您可以通过修改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);
}
可能还有许多其他选择,但据我所知,GitHub上有一个正在积极开发的项目https://github.com/zeit/pkg。你可以玩。在https://github.com/nexe/nexe上还有一个,但不在积极开发中。