本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
配置应用程序对 Elastic Beanstalk 的依赖关系
您的应用程序可能依赖于某些应用程序 Node.js 模块,例如您在require()
语句中指定的模块。这些模块存储在 node_modules
目录中。当您的应用程序运行时,Node.js 从这个目录加载模块。有关更多信息,请参阅中的 “从 node_modules 文件夹加载
您可以使用 package.json
文件指定这些模块依赖项。如果 Elastic Beanstalk 检测到此文件,但 node_modules
目录不存在,则 Elastic Beanstalk 将以 webapp 用户身份运行 npm install
。npm
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.js node_modules 目录中的依赖关系
指定 Node.js 与 package.json 文件的依赖关系
包含项目源的根目录中的 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
文件中指定依赖关系,请使用依赖关系和devDependencies属性。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"
}
版本和版本范围
重要
指定版本范围的功能不适用于在 AL2 023 上运行的 Node.js 平台分支。在 AL2 023,我们只支持特定 Node.js 分支中的一个 Node.js 版本。如果您的 package.json
文件指定了版本范围,我们将忽略它并默认设为 Node.js 的平台分支版本。
在package.json
文件中使用engines
关键字指定 Node.js 你想让你的应用程序使用的版本。您还可以使用 npm 表示法指定版本范围。有关版本范围语法的更多信息,请参阅上的 “使用 npm 进行语义版本控制engines
关键字 Node.js package.json
file 取代了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 每个平台分支的版本,请参阅 Node.js在AWS Elastic Beanstalk 平台指南中。
注意
如果对您正在使用的 Node.js 版本的支持已从平台中移除,则您必须先更改或移除 Node.js 版本设置再进行平台更新。当在一个或多个 Node.js 版本中识别到安全漏洞时,可能会发生这种情况。
发生此情况时,尝试更新到不支持所配置的 Node.js 版本的新平台版本会失败。为避免需要创建新环境,请将 package.json
中的 Node.js 版本设置更改为旧平台版本和新平台版本都支持的 Node.js 版本。您可以选择指定包含受支持版本的 Node.js 版本范围,如本主题前面所述。您还可以选择删除设置,然后部署新的源包。
包括 Node.js node_modules 目录中的依赖关系
要将依赖项程序包与应用程序代码一起部署到环境实例,请将它们包括在项目源根目录下名为 node_modules
的目录中。有关更多信息,请参阅 npm Docs 网站中的在本地下载和安装软件包
当您将node_modules
目录部署到 AL2 023/ AL2 Node.js 平台版本,Elastic Beanstalk 假设你提供了自己的依赖包,并且避免安装在 package.json 文件中指定的依赖项。Node.js 在node_modules
目录中查找依赖关系。有关更多信息,请参阅《从 node_modules 文件夹加载
注意
如果您在 Elastic Beanstalk 运行 npm install
时遇到任何部署问题,请在调查问题时考虑使用本主题中描述的方法作为解决方法。