我对AWS Beanstalk部署的整体工作流程感到好奇。我假设它在某些时候运行npm以获得在服务器上安装的软件包。但我只是想知道AWS Beanstalk是否使用'npm install --production'的最新命令来安装软件包。目前我有一个如下所示的packages.json文件,如果可能的话,我想确保只安装依赖项,而不是devDependencies。
"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"
}
答案 0 :(得分:21)
如果设置环境变量npm install
,则可以让AWS Elastic Beanstalk在生产模式下运行NPM_CONFIG_PRODUCTION=true
。您可以通过Elastic Beanstalk Web控制台执行此操作。
或者,将以下文本保存到项目根目录中名为.config
的目录中的后缀为.ebextensions
的任何文件中,您可以实现相同的操作,而无需每次都在Web控制台中设置它们:
option_settings:
- option_name: NPM_CONFIG_PRODUCTION
value: true
注意:请确保您使用的是空格,而不是制表符,因为它是YAML格式。
我发现在t1.micro环境中更新新node.js代码的时间从大约5分钟下降到90秒,现在它没有安装所有devDependencies,如grunt,karma,mocha等
答案 1 :(得分:4)
目前,Elastic Beanstalk环境运行npm install
而没有--production
标志。在导出开发人员提供的任何env自定义项(即环境选项设置)之前,/opt/elasticbeanstalk/containerfiles/ebnode.py
上的实例会发生这种情况,这意味着在EB环境中配置NODE_ENV=production
也不会阻止处理devDependencies
答案 2 :(得分:4)
在新版本的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 install --production
默认。
对于那些想要禁用它的人(就像我在回答这个问题时那样),你必须在项目的.ebextensions
文件夹中创建一个 anything.config &# 39; s根文件夹(其中任何东西意味着什么;节点,npm,无论你想要什么),内容:
option_settings:
- namespace: aws:elasticbeanstalk:application:environment
option_name: NPM_USE_PRODUCTION
value: false
答案 3 :(得分:1)
另一个选项是使用npm-shrinkwrap,它还具有让您同时锁定依赖项的额外好处。
AWS Elastic Beanstalk suggests it here。