在部署Nodejs应用程序时,AWS Beanstalk如何使用NPM?

时间:2013-12-12 19:24:11

标签: javascript amazon-web-services npm elastic-beanstalk

我对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"
}

4 个答案:

答案 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