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

Adr*_*ron 16 javascript amazon-web-services npm amazon-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"
}
Run Code Online (Sandbox Code Playgroud)

rga*_*eth 22

npm install如果设置环境变量,则可以使AWS Elastic Beanstalk 在生产模式下运行NPM_CONFIG_PRODUCTION=true.您可以通过Elastic Beanstalk Web控制台执行此操作.

或者,将以下文本保存到项目根.config目录中调用的目录中具有后缀的任何文件中,.ebextensions您可以实现相同的操作,而无需每次都在Web控制台中设置它们:

option_settings:

  - option_name: NPM_CONFIG_PRODUCTION
    value: true
Run Code Online (Sandbox Code Playgroud)

注意:确保使用空格而不是制表符,因为它是YAML格式.

我发现在t1.micro环境中更新新node.js代码的时间从大约5分钟下降到90秒,现在它没有安装所有devDependencies,如grunt,karma,mocha等.

  • 在最新的Elastic Beanstalk解决方案堆栈(运行Node.js的64位Amazon Linux 2014.03 v1.0.4)中,ebnode.py脚本引用了一个默认为'true'的`NPM_USE_PRODUCTION`变量.在.config文件中将其设置为'false'将导致`npm install`在没有`--production`标志的情况下运行.我没有找到对'NPM_CONFIG_PRODUCTION`变量的引用,尽管它可能在别处用于设置`NPM_USE_PRODUCTION`.亚马逊的任何配置文档中都没有提到任何变量. (10认同)

Edm*_*ues 7

在新版本的Elastic Beanstalk Node堆栈中,配置已更改,如@etreworgy的注释所指出。

您可以通过在EC2实例中运行来检查当前行为:

cat /opt/elasticbeanstalk/containerfiles/ebnode.py | grep -A 5 PRODUCTION
Run Code Online (Sandbox Code Playgroud)

从今天开始返回:

        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'
Run Code Online (Sandbox Code Playgroud)

所以,目前,它使用npm install --production默认

对于那些想要禁用它的人(就像我回答这个问题时一样),您必须在项目的根文件夹(其中的任何内容实际上是任何东西;节点,npm,无论您想要什么).ebextensions文件夹内创建一个anything.config。 ),内容如下:

option_settings:
    - namespace: aws:elasticbeanstalk:application:environment
      option_name: NPM_USE_PRODUCTION
      value: false
Run Code Online (Sandbox Code Playgroud)


小智 5

目前,Elastic Beanstalk 环境npm install在没有该--production标志的情况下运行。/opt/elasticbeanstalk/containerfiles/ebnode.py这种情况发生在导出开发人员提供的任何 env 自定义(即环境选项设置)之前的实例上,这意味着NODE_ENV=productionEB 环境配置中的设置也不会阻止处理 devDependency。

  • 这不是一个正确的答案(至少在今天)。影响“npm install”的方法是通过变量“NPM_CONFIG_Production”而不是“NODE_ENV”。Elastic Beanstalk 确实支持这一点,正如我在下面自己的回答中指出的那样。 (11认同)