8

我正在为客户端构建一个简单的 Node.JS 应用程序。webapp 应该很容易在每个服务器实例(即 RedHat EL 6.3)上部署,“关键在手”。

打包 Node.JS 应用程序的最佳方式是什么?基本上,我需要一个“安装程序”或“包”来:

  • 安装 Node.JS
  • 安装依赖项 ( npm install)
  • 填充应用程序文件(CSS、JS、HTML 等)
4

1 回答 1

8

您应该提供一个独立的包裹。请查看伟大的网站The Twelve-Factor App,特别是构建、发布、运行部分。该网站体现了许多经验丰富的运营工程师来之不易的智慧。

  • 在您的应用程序的存储库中,编写一个可以生成可分发存档的脚本(shell、节点等)
  • RPM 或 tar 存档是您最明智的 2 个选择。tar 更便携、更简单。RPM 可以很好地与基于 RPM 的发行版集成。如果您没有做很多软件打包/管理工作,我建议您从 tar 开始。RPM 比 tar 复杂得多。
  • tar 存档应该在其中嵌入 node.js 文件。这将使您的应用程序易于安装,并避免共享系统范围的节点安装,从而造成人为耦合。如果你走 RPM 路线,你可以在你的 RPM 规范文件中指定 node 作为依赖项(但你可能不应该 - 见下文)。
  • 存档也应该嵌入所有的 npm 依赖项。不要npm install在包安装时运行。考虑在开发期间使用npm shrinkwrap工具来管理您的依赖项,但在部署时它们应该预先捆绑并准备好运行。

具体来说,这些是您应该避免的坏主意:

  • 安装过程中不要从 Internet 下载任何内容。这是脆弱、缓慢的,并且可能会给您带来糟糕的惊喜,包括安全问题
  • 不要在安装时构建可以在构建时构建的工件。所以发布预构建的 CSS 文件、requirejs 优化文件、预编译的二进制文件等。

至于您的应用程序 RPM 是否应该将 node.js 列为依赖项或将节点嵌入到 RPM 中,这里有几点需要考虑。

  • 将 node.js 嵌入到您的 RPM 中
    • 单个.rpm文件分发
    • 允许您的应用程序严格控制它使用的节点版本。(见下文)
    • 更高的可靠性。事实上,您的应用程序可能至少与您开发的 node.js 的次要版本(例如 0.8.x)或什至补丁版本(例如 >= 0.8.12 < 0.9)紧密耦合。最好允许 node.js 将您的应用程序与操作系统分离,但不要误以为您的应用程序无需测试和调整即可在不同版本的 node.js 上可靠地运行。现在最常见的情况是操作系统上只有一个应用程序运行,并且应用程序之间共享节点的概念错误地重视磁盘空间的节约,而不是应用程序的适当解耦和操作独立性。
    • 目前尚不清楚 yumland 中是否有任何官方/可靠的预构建 RPM 可以“正常工作”。
  • 将 node.js 指定为 PRM 的依赖项
    • 遵循操作系统包管理的一般理念(避免重复、节省磁盘空间等)
    • RPM 在库存管理、卸载、升级等方面提供了超越 TAR 的功能。既然您在问这个问题,您可能还没有准备好正确解决这些问题,因此您可能希望从 tar 开始,并且一旦您对它有了深入的了解,考虑 RPM 升级脚本等。
    • 一旦您的应用程序开始使用数据库或 3,支持电子邮件、日志聚合器等的守护进程,“分发单个文件”的好点很快就会变得站不住脚。
于 2012-12-29T18:26:01.040 回答