配置您的应用程序的依赖项 - Amazon Elastic Beanstalk
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

配置您的应用程序的依赖项

您的应用程序可能有某些 Node.js 模块的依赖项,例如您在 require() 语句中指定的项。这些模块存储在 node_modules 目录中。当您的应用程序运行时,Node.js 将从此目录加载模块。有关更多信息,请参阅 Node.js 文档中的从 node_modules 文件夹加载

您可以使用 package.json 文件指定这些模块依赖项。如果 Elastic Beanstalk 检测到此文件,但 node_modules 目录不存在,则 Elastic Beanstalk 将以 webapp 用户身份运行 npm installnpm install 命令将依赖项安装在 Elastic Beanstalk 事先创建的 node_modules 目录中。npm install 命令会从公共 npm 注册表或其他位置访问 package.json 文件中列出的软件包。有关更多信息,请参阅 npm Docs 网站。

如果 Elastic Beanstalk 检测到 node_modules 目录,则即使存在 package.json 文件,Elastic Beanstalk 也不会运行 npm install。Elastic Beanstalk 假设依赖项包在 node_modules 目录中可供 Node.js 访问和加载。

以下各部分提供有关为应用程序建立 Node.js 模块依赖项的更多信息。

注意

如果您在 Elastic Beanstalk 运行 npm install 时遇到任何部署问题,请考虑其他方法。在您的应用程序源包中包括含依赖模块的 node_modules 目录。这样做可以避免在调查问题时从公共 npm 注册表安装依赖项时出现问题。由于依赖模块来自本地目录,这样做也可能有助于缩短部署时间。有关更多信息,请参阅 在 node_modules 目录中包括 Node.js 依赖项

使用 package.json 文件指定 Node.js 依赖项

包含项目源的根目录中的 package.json 文件来指定依赖项包并提供启动命令。当 package.json 文件存在,且项目源的根目录中不存在 node_modules 目录时,Elastic Beanstalk 会以 webapp 用户的身份运行 npm install 来从公共 npm 注册表安装依赖项。Elastic Beanstalk 还使用 start 命令来启动您的应用程序。有关 package.json 文件的更多信息,请参阅 npm Docs 网站中的package.json 文件中指定依赖项

使用 scripts 关键字来提供启动命令。当前使用 scripts 关键字,而不是 aws:elasticbeanstalk:container:nodejs 命名空间中的原有 NodeCommand 选项。

例 package.json - Express
{ "name": "my-app", "version": "0.0.1", "private": true, "dependencies": { "ejs": "latest", "aws-sdk": "latest", "express": "latest", "body-parser": "latest" }, "scripts": { "start": "node app.js" } }
生产模式和开发依赖项

要在 package.json 文件中指定依赖项,请使用 dependenciesdevDependencies 属性。dependencies 属性指定您的应用程序在生产中所需的软件包。devDependencies 属性指定仅本地开发和测试需要的软件包。

Elastic Beanstalk 使用以下命令以 webapp 用户身份运行 npm install。命令选项因运行应用程序的平台分支中包含的 npm 版本而异。

  • npm v6 – 默认情况下,Elastic Beanstalk 在生产模式下安装依赖项。它使用命令 npm install --production

  • npm v7 或更高版本 – Elastic Beanstalk 省略了 devDependencies。它使用命令 npm install --omit=dev

上面列出的两个命令都没有安装属于 devDependencies 的软件包。

如果您需要安装 devDependencies 软件包,则请将 NPM_USE_PRODUCTION 环境属性设置为 false。使用此设置,在运行 npm install 时将不使用上述选项。这将导致 devDependencies 软件包被安装。

SSH 和 HTTPS

从 2023 年 3 月 7 日的 Amazon Linux 2 平台版本开始,您还可以使用 SSH 和 HTTPS 协议从 Git 存储库检索软件包。平台分支 Node.js 16 同时支持 SSH 和 HTTPS 协议。Node.js 14 仅支持 HTTPS 协议。

例 package.json – Node.js 16 同时支持 HTTPS 和 SSH
... "dependencies": { "aws-sdk": "https://github.com/aws/aws-sdk-js.git", "aws-chime": "git+ssh://git@github.com:aws/amazon-chime-sdk-js.git" }

版本和版本范围

重要

指定版本范围的功能不适用于在 AL2023 上运行的 Node.js 平台分支。在 AL2023 上的特定 Node.js 分支中,只支持一个 Node.js 版本。如果您的 package.json 文件指定了版本范围,我们将忽略它并默认设为 Node.js 的平台分支版本。

使用 package.json 文件中的 engines 关键字指定您希望应用程序使用的 Node.js 版本。您还可以使用 npm 表示法指定版本范围。有关版本范围的语法的更多信息,请参阅 Node.js 网站上的使用 npm 的语义版本控制。Node.js package.json 文件中的 engines 关键字取代 aws:elasticbeanstalk:container:nodejs 命名空间中的原有 NodeVersion 选项。

package.json – 单一 Node.js 版本
{ ... "engines": { "node" : "14.16.0" } }
package.json – Node.js 版本范围
{ ... "engines": { "node" : ">=10 <11" } }

当指示版本范围时,Elastic Beanstalk 会安装该平台在该范围内可用的最新 Node.js 版本。在此示例中,范围指示版本必须大于或等于版本 10,但小于版本 11。因此,Elastic Beanstalk 安装了最新的 Node.js 版本 10.x.y,该版本在支持的平台上可用。

请注意,您只能指定与平台分支对应的 Node.js 版本。例如,如果您使用的是 Node.js 16 平台分支,则只能指定 16.x.y Node.js 版本。您可以使用 npm 支持的版本范围选项来提高灵活度。有关每个平台分支的有效 Node.js 版本,请参阅 Amazon Elastic Beanstalk 平台指南中的 Node.js

注意

如果对您正在使用的 Node.js 版本的支持已从平台中移除,则您必须先更改或移除 Node.js 版本设置再进行平台更新。当在一个或多个 Node.js 版本中识别到安全漏洞时,可能会发生这种情况。

发生此情况时,尝试更新到不支持所配置的 Node.js 版本的新平台版本会失败。为避免需要创建新环境,请将 package.json 中的 Node.js 版本设置更改为旧平台版本和新平台版本都支持的 Node.js 版本。您可以选择指定包含受支持版本的 Node.js 版本范围,如本主题前面所述。您还可以选择删除设置,然后部署新的源包。

在 node_modules 目录中包括 Node.js 依赖项

要将依赖项程序包与应用程序代码一起部署到环境实例,请将它们包括在项目源根目录下名为 node_modules 的目录中。有关更多信息,请参阅 npm Docs 网站中的在本地下载和安装软件包

node_modules 目录部署到 Amazon Linux 2 Node.js 平台版本时,Elastic Beanstalk 假定您提供了自己的依赖项程序包,并避免安装 package.json 文件中指定的依赖项。Node.js 在 node_modules 目录中查找依赖项。有关详细信息,请参阅 Node.js 文档中的从 node_modules 文件夹加载

注意

如果您在 Elastic Beanstalk 运行 npm install 时遇到任何部署问题,请在调查问题时考虑使用本主题中描述的方法作为解决方法。