2013-12-12 72 views
16

我很好奇AWS Beanstalk部署的整个工作流程。我假设它在某个时刻运行npm以获取安装在服务器上的软件包。但我只是想知道AWS Beanstalk是否使用'npm install --production'的最新命令来安装软件包。目前我有一个如下所示的packages.json文件,如果可能,只保证只安装了依赖关系,而不是devDependencies。AWS Beanstalk在部署Nodejs应用程序时如何使用NPM?

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

回答

5

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

+0

感谢您的答案。绝对好,如果这是作为一个功能添加。我也意识到,Node.js团队在我们所有人身上隐藏着这种东西。 ;) – Adron

+9

这不是一个正确的答案(至少今天)。影响'npm install'的方法是通过变量'NPM_CONFIG_PRODUCTION'而不是'NODE_ENV'。 Elastic Beanstalk确实支持这一点,正如我在下面的自己的答案中所指出的那样。 – rgareth

21

如果您设置环境变量NPM_CONFIG_PRODUCTION=true,那么您可以让AWS Elastic Beanstalk在生产模式下运行npm install。您可以通过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,等等。

+8

在最新的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'。亚马逊的任何配置文档都没有提到这两个变量。 – etreworgy

+1

这会运行'postinstall'吗? – Shamoon

+0

显然不运行'postinstall',但它会运行'prestart'。他们如何设法使npm的使用如此困难? –

1

另一个选择是使用npm-shrinkwrap,它具有让您同时锁定依赖关系的额外好处。

AWS Elastic Beanstalk suggests it here

+1

引用的文档还指出,npm-shrinkwrap将加速部署,因为npm install只需要执行一次。 – dhollenbeck

3

在新版本的Elastic Beanstalk Node的堆栈中,配置发生了变化,正如@ etreworgy的评论指出的那样。

您可以查看当前的行为,通过EC2实例中运行:

cat /opt/elasticbeanstalk/containerfiles/ebnode.py | grep PRODUCTION 

它返回,从今天开始:

if 'NPM_USE_PRODUCTION' not in npm_env: 
    npm_env['NPM_USE_PRODUCTION'] = 'true' 
if npm_env['NPM_USE_PRODUCTION'] == 'true': 

所以,目前,它采用了npm install --production通过默认

对于要禁用它(因为我是当我来到这个答案),你必须创建你的项目的根文件夹中的文件夹.ebextensionsanything.config那几件(其中什么意味着真的任何东西;节点,NPM,任何你想要的),与内容:

option_settings: 
    - namespace: aws:elasticbeanstalk:application:environment 
     option_name: NPM_USE_PRODUCTION 
     value: false 
相关问题