Javascript AWS Beanstalk在部署Nodejs应用程序时如何使用NPM?
我很好奇AWS Beanstalk部署的总体工作流程。我假设它在某个时候运行npm,以便在服务器上安装包。但我只是想知道AWS Beanstalk是否使用最新的命令“npm install--production”来安装软件包。目前我有一个packages.json文件,如下所示,如果可能的话,我希望确保只安装依赖项,而不安装devdependencyJavascript AWS Beanstalk在部署Nodejs应用程序时如何使用NPM?,javascript,amazon-web-services,npm,amazon-elastic-beanstalk,Javascript,Amazon Web Services,Npm,Amazon Elastic Beanstalk,我很好奇AWS Beanstalk部署的总体工作流程。我假设它在某个时候运行npm,以便在服务器上安装包。但我只是想知道AWS Beanstalk是否使用最新的命令“npm install--production”来安装软件包。目前我有一个packages.json文件,如下所示,如果可能的话,我希望确保只安装依赖项,而不安装devdependency "dependencies": { "express": "3.4.4", "jade": "*", "restify": "~2.
"dependencies": {
"express": "3.4.4",
"jade": "*",
"restify": "~2.6.0",
"assert": "~1.0.0",
"orchestrate": "0.0.2",
"chance": "~0.5.3"
},
"devDependencies": {
"mocha": "~1.15.1"
}
目前,Elastic Beanstalk环境运行的是
npm安装
,没有--生产
标志。在导出开发人员提供的任何环境自定义设置(即环境选项设置)之前,在/opt/elasticbeanstalk/containerfiles/ebnode.py的实例上会发生这种情况,这意味着,在EB环境的配置中设置NODE_ENV=production
也不会阻止对devdependency的处理。如果设置环境变量npm_CONFIG\u production=true
,则可以让AWS Elastic Beanstalk在生产模式下运行npm install
。您可以通过Elastic Beanstalk web控制台执行此操作
或者,将以下文本保存到项目根目录中名为.ebextensions
的目录中任何后缀为.config
的文件中,无需每次在web控制台中设置它们,即可实现相同的功能:
option_settings:
- option_name: NPM_CONFIG_PRODUCTION
value: true
注意:确保使用的是空格,而不是制表符,因为它是YAML格式
我发现在t1.micro环境中更新新node.js代码的时间从大约5分钟减少到90秒,因为它没有安装所有的DevDependence,如grunt、karma、mocha等。另一个选择是使用npm shrinkwrap,这样做的另一个好处是可以同时锁定依赖项
AWS弹性豆茎 在新版本的Elastic Beanstalk节点的堆栈中,配置已更改,@etreworgy的评论指出了这一点
通过在EC2实例内运行,可以检查当前行为:
cat /opt/elasticbeanstalk/containerfiles/ebnode.py | grep -A 5 PRODUCTION
从今天起,它将返回:
if 'NPM_USE_PRODUCTION' not in npm_env:
npm_env['NPM_USE_PRODUCTION'] = 'true'
if npm_env['NPM_USE_PRODUCTION'] == 'true':
print 'Running npm with --production flag'
check_call([npm_path, '--production', 'install'], cwd=app_path, env=npm_env)
check_call([npm_path, '--production', 'rebuild'], cwd=app_path, env=npm_env)
else:
print 'Running npm without --production flag'
因此,目前,它使用npm安装--production
bydefault
对于那些想要禁用它的人(正如我在回答这个问题时所做的那样),您必须在项目根文件夹的.ebextensions
文件夹中创建一个anything.config,内容如下:
option_settings:
- namespace: aws:elasticbeanstalk:application:environment
option_name: NPM_USE_PRODUCTION
value: false
谢谢你的回答。如果将其作为一项功能添加,肯定很好。我也意识到Node.js团队有点偷偷地把这件事告诉了我们所有人这不是一个正确的答案(至少在今天)。影响npm安装的方法是通过变量npm\u CONFIG\u PRODUCTION
而不是NODE\u ENV
。Elastic Beanstalk确实支持这一点,正如我在下面的回答中所指出的。更新日期:2020年2月:“默认情况下,Elastic Beanstalk在生产模式下安装依赖项(npm安装--生产)。如果要在环境实例上安装开发依赖项,请将npm_USE_生产环境属性设置为false。”在最新的Elastic Beanstalk解决方案堆栈(运行Node.js的64位Amazon Linux 2014.03 v1.0.4)中,ebnode.py脚本引用了一个默认为“true”的NPM\u USE\u PRODUCTION
变量。在.config文件中将此设置为“false”将导致运行npm install
,而不带--production
标志。我没有找到对NPM\u CONFIG\u PRODUCTION
变量的引用,尽管它可能在其他地方用于设置NPM\u USE\u PRODUCTION
。亚马逊的任何配置文档中似乎都没有提到这两个变量。这会运行postinstall
?显然不会运行postinstall
,但会运行prestart
。他们是如何使npm的使用变得如此困难的?您的答案几乎已经完成了,尽管现在到2021年,您需要使用名为npm_use_PRODUCTION而不是npm_CONFIG_PRODUCTION的环境变量。参考文档还指出,npm shrinkwrap将加快部署,因为npm安装只需要执行一次。非常感谢你的答案很简单,但对我来说解决了同样的问题。