Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript AWS Beanstalk在部署Nodejs应用程序时如何使用NPM?_Javascript_Amazon Web Services_Npm_Amazon Elastic Beanstalk - Fatal编程技术网

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

Javascript 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.

我很好奇AWS Beanstalk部署的总体工作流程。我假设它在某个时候运行npm,以便在服务器上安装包。但我只是想知道AWS Beanstalk是否使用最新的命令“npm install--production”来安装软件包。目前我有一个packages.json文件,如下所示,如果可能的话,我希望确保只安装依赖项,而不安装devdependency

"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安装只需要执行一次。非常感谢你的答案很简单,但对我来说解决了同样的问题。