【问题标题】:How do I deploy Node.js applications as a single executable file? [duplicate]如何将 Node.js 应用程序部署为单个可执行文件? [复制]
【发布时间】:2012-12-28 03:40:02
【问题描述】:

假设我已经编写了一个 Node.js 应用程序,现在我想分发它。当然,我想让用户更容易,所以我不希望他安装 Node.js,运行npm install,然后手动输入node app.js

我更喜欢单个可执行文件,例如Windows 上的 .exe 文件。

我该如何处理?

我知道this thread,无论如何这只是关于Windows。我怎样才能以独立于平台的方式实现这一点?有任何想法吗?最佳实践? ...?

完美的解决方案是我可以提供源文件夹的“编译器”。源文件夹包含各种.js 文件中的应用程序本身、node_modules 文件夹和一些元数据,例如package.json。输出应该是各种平台的二进制文件,例如 Windows、OS X 和 Linux。

哦,重要的是:我不想对源代码进行 任何 更改,因此使用相对路径调用 require 应该仍然有效,即使此相对路径现在在里面打包的应用程序。

有什么想法吗?

PS:我不希望用户独立安装 Node.js,它也应该包含在可执行文件中。

【问题讨论】:

  • 这是一个网络应用吗? (意思是有一个基于 Web 的 UI)还是一个更简单的命令行应用程序?如果您需要生成某种浏览器,我怀疑这会变得更加困难。
  • 以这种方式部署到 unix 操作系统的 node.js 社区成员的数量:零。您确定 tar 存档、deb 或 rpm 等久经考验的方法不适合您吗?您是否正在发明一个并不真正存在的问题来解决?
  • @Alex Wayne:这是一个服务器端应用程序,因此无需启动浏览器。
  • PS:此外,我的问题包括是否有 one 工具可以用来为任何平台创建解决方案,因此即使是自动创建 .exe 文件的工具Windows 和 .deb 文件会很棒;-)
  • @PeterLyons 我觉得这很难相信。我也可以证明。

标签: node.js deployment


【解决方案1】:

与此同时,我找到了(对我而言)完美的解决方案:nexe,它可以从 Node.js 应用程序(包括其所有模块)创建单个可执行文件。

这是理想解决方案的次佳选择。

【讨论】:

  • 根据文档,nexe现在支持Windows :)
  • 我捆绑了我的 nodeJS 应用程序,我得到了这个错误:错误:ENOENT,没有这样的文件或目录 '..../release/types/mime.types' 我查看了发布文件夹, types/mime.types 文件夹从未被创建。有人有什么想法吗?
  • 作为nexe的当前维护者,native模块已经做了一段时间了,放心很快就会实现!
  • 太好了,感谢您的更新:-)
  • 缺乏对本机模块的支持是一个很大的障碍。此外,最新版本的 nexe 很难使用动态路径,这在最流行的 npm 包中很常见。
【解决方案2】:

首先,我们正在讨论为研讨会、演示等打包 Node.js 应用程序,这样可以方便地让应用程序“刚刚运行”,而无需最终用户关心安装和依赖关系。

您可以尝试以下设置:

  1. 获取您的应用源代码
  2. npm install 所有依赖项(通过 package.json)到 local node_modules 目录。如果存在二进制依赖关系,请务必在要单独支持的每个平台上执行此步骤。
  3. 将 Node.js 二进制文件 - Windows 上的 node.exe,(可能)OS X/Linux 上的 /usr/local/bin/node 复制到项目的根目录文件夹。在 OS X/Linux 上,您可以使用 which node 找到 Node.js 二进制文件的位置。

对于 Windows:
创建自解压存档,7zip_extra 支持在解压后立即执行命令的方式,参见:http://www.msfn.org/board/topic/39048-how-to-make-a-7-zip-switchless-installer/

对于 OS X/Linux:
可以使用makeselfunzipsfx之类的工具(不知道是不是用默认定义的CHEAP_SFX_AUTORUN编译的)。

这些工具会将存档解压缩到一个临时目录,执行给定的命令(例如node app.js)并在完成后删除所有文件。

【讨论】:

  • 这样的打包根据nodejs license合法吗?
【解决方案3】:

不要打死马,但你描述的解决方案听起来很像Node-Webkit

来自 Git 页面:

node-webkit 是一个基于 Chromium 和 node.js 的应用运行时。您可以使用 node-webkit 以 HTML 和 JavaScript 编写本机应用程序。它还允许您直接从 DOM 调用 Node.js 模块,并启用一种使用所有 Web 技术编写本机应用程序的新方法。

These instructions 专门详细介绍了用户可以执行的单文件应用程序的创建,this portion 描述了外部依赖项。

我不确定这是否是确切的解决方案,但似乎非常接近。

希望对你有帮助!

【讨论】:

  • Node-Webkit 真是太棒了,尤其是在演示 Node.js 解决方案时,您可以在一个地方拥有所需的一切。
  • electron框架也不错。但是 nwjs 和 electron 都专注于以 UI 为中心的应用程序。打包一个服务器应用程序可能是可能的,但不是典型的用例。根据我的经验,隐藏 UI 并从 CLI 运行它是一项额外的工作。
  • Nodewebkit打包根据nodejs许可合法吗?
  • @Pacerier 我相信是的,但是 IANAL。话虽如此,Electron 已经真正取代了它,我相信 GitHub 的律师确保它是合规的。
【解决方案4】:

JXcore 将允许您将任何 nodejs 应用程序转换为单个可执行文件,包括 Windows、Linux 或 Mac OS X 中的所有依赖项。

这里是安装程序的链接: https://github.com/jxcore/jxcore-release

这里是如何设置它的链接: http://jxcore.com/turn-node-applications-into-executables/

它非常易于使用,我已经在 Windows 8.1 和 Ubuntu 14.04 中对其进行了测试。

仅供参考:JXcore 是 NodeJS 的一个分支,因此它与 NodeJS 100% 兼容,并具有一些额外的功能。

【讨论】:

【解决方案5】:

除了 nexe,browserify 可用于将所有依赖项捆绑为单个 .js 文件。这不会捆绑实际的节点可执行文件,只是处理 javascript 端。它也不处理本机模块。纯节点编译的命令行选项为browserify --output bundle.js --bare --dg false input.js

【讨论】:

  • 我这样使用它:browserify --bare input.js > output.js
【解决方案6】:

创建安装程序需要执行多个步骤,并且每个操作系统的安装程序都不同。例如:

【讨论】:

【解决方案7】:

您可以创建一个 git repo 并设置指向节点 git repo 的链接作为依赖项。然后任何克隆 repo 的用户也可以安装节点。

#git submodule [--quiet] add [-b branch] [-f|--force]
git submodule add /var/Node-repo.git common

您可以轻松地打包一个脚本以自动克隆您在某处托管的 git 存储库并从一个脚本文件“安装”。

#!/bin/sh
#clone git repo
git clone your-repo.git

【讨论】:

  • 但这会给你 source 存储库,而不是二进制文件。用户仍然需要编译 Node.js,因为这样做的所有依赖项都已经存在(在 Windows/OS X 的“开箱即用”安装中并非如此)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-01
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
  • 2017-03-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多