使用elastic beanstalk部署复杂node.js项目

使用elastic beanstalk部署复杂node.js项目,node.js,npm,amazon-elastic-beanstalk,Node.js,Npm,Amazon Elastic Beanstalk,我想知道使用elastic beanstalk部署complex node.js的最佳实践是什么,而不依赖外部npm存储库的可用性(以及为内部开发的包处理私有管理的git存储库的凭据和高可用性) 看起来有一个学派鼓吹将实际部署的项目的node_模块签入到源代码树中 资料来源1: 资料来源2: 因此,听起来将它们签入是正确的方法,但是对于一些已编译的包(在mac上开发并部署到linux上),存在不同二进制格式的问题 我曾尝试按照yammer guys的建议(签入模块,但bin文件夹除外),但即使本

我想知道使用elastic beanstalk部署complex node.js的最佳实践是什么,而不依赖外部npm存储库的可用性(以及为内部开发的包处理私有管理的git存储库的凭据和高可用性)

看起来有一个学派鼓吹将实际部署的项目的node_模块签入到源代码树中

资料来源1:

资料来源2:

因此,听起来将它们签入是正确的方法,但是对于一些已编译的包(在mac上开发并部署到linux上),存在不同二进制格式的问题

我曾尝试按照yammer guys的建议(签入模块,但bin文件夹除外),但即使本地“npm rebuild”命令失败(它尝试在express.js模块中不存在的bin文件夹中chmod某些内容),因此我甚至没有尝试查看beanstalk默认部署环境将如何处理此类存储库。我假设它运行“npm安装”(它什么也不做),但它会运行“npm重建”吗

那么,在部署具有多个依赖项的复杂项目时,最佳做法是什么?在node/beanstalk世界中,这一定是一个已解决的问题,不是吗


谢谢

这是我的配置,可以满足您的要求。将其保存在.ebextensions文件夹中,即可进行设置。我的答案和中的上级答案之间的唯一区别是NPM_CONFIG_UNSAFE_PERM=true行,这是我从中学到的


您可能正在使用依赖于二进制文件的库。如果您的登台环境与生产环境100%相同,请继续,毫无疑问,检查node_modules文件夹。如果您在登台和生产中未使用不同版本的节点,则不需要npm rebuild。只需复制所有内容,就可以了。mongodb bson,kerberos使用二进制文件,我正在mac上开发,在部署到amazon linux机器上时,我无法将二进制文件提交到存储库中。我理解。但此时,您可能需要考虑使用类似vagrant的软件,这将使您的生活更加简单。我假设此解决方案可以加快npm的安装速度,但在部署新实例时,它不会消除对NPMJ或其他服务器的依赖,也不会解决跨实例的模块版本不一致的问题,对吗?没错-外部服务和不一致的模块版本仍然会影响您。在这些情况下,您可能希望从“git aws.push”转向类似于+的tight package.json版本控制和npm shrinkwrap的健康帮助。
packages:
  yum:
    git: []
    gcc: []
    make: []
    openssl-devel: []
    libxml2: []
    libxml2-devel: []

files:
  "/opt/elasticbeanstalk/env.vars" :
    mode: "000775"
    owner: root
    group: users
    content: |
      export HOME=/home/ec2-user # ADDED EXPORT COMMAND
      export NPM_CONFIG_LOGLEVEL=error
      export NPM_CONFIG_UNSAFE_PERM=true
      export NODE_PATH=`ls -td /opt/elasticbeanstalk/node-install/node-* | head -1`/bin
  "/opt/elasticbeanstalk/hooks/appdeploy/pre/50npm.sh" :
    mode: "000775"
    owner: root
    group: users
    content: |
      #!/bin/bash
      . /opt/elasticbeanstalk/env.vars
      function error_exit
      {
        eventHelper.py --msg "$1" --severity ERROR
        exit $2
      }

      #install not-installed yet app node_modules
      if [ ! -d "/var/node_modules" ]; then
        mkdir /var/node_modules ;
      fi
      if [ -d /tmp/deployment/application ]; then
        ln -s /var/node_modules /tmp/deployment/application/
      fi

      OUT=$([ -d "/tmp/deployment/application" ] && cd /tmp/deployment/application && $NODE_PATH/npm install 2>&1) || error_exit "Failed to run npm install.  $OUT" $?
      echo $OUT
  "/opt/elasticbeanstalk/hooks/configdeploy/pre/50npm.sh" :
    mode: "000666"
    owner: root
    group: users
    content: |
       #no need to run npm install during configdeploy