Как AWS Beanstalk использует NPM при развертывании приложения Nodejs?

Мне интересен общий рабочий процесс развертывания Beanstalk AWS. Я предполагаю, что он запускает npm в какой-то момент, чтобы установить пакеты на сервер (ы). Но мне просто интересно, использует ли AWS Beanstalk последнюю команду "npm install --production" для установки пакетов. В настоящее время у меня есть файл package.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"
}

Ответ 1

В настоящее время среда Elastic Beanstalk работает npm install без флага --production. Это происходит в экземпляре /opt/elasticbeanstalk/containerfiles/ebnode.py до того, как будут экспортированы какие-либо пользовательские настройки, предоставленные разработчиком (т.е. Параметры параметров среды), что означает, что настройка NODE_ENV=production в конфигурации EB Environment также не предотвращает обработку devDependencies.

Ответ 2

Вы можете получить AWS Elastic Beanstalk для запуска npm install в рабочем режиме, если вы установите переменную среды NPM_CONFIG_PRODUCTION=true. Вы можете сделать это через веб-консоль Elastic Beanstalk.

В качестве альтернативы сохраните следующий текст в любом файле с суффиксом .config внутри каталога с именем .ebextensions в корне проекта, и вы можете добиться того же самого, не устанавливая его каждый раз в веб-консоли:

option_settings:

  - option_name: NPM_CONFIG_PRODUCTION
    value: true

Примечание. Убедитесь, что вы используете пробелы, а не вкладки, так как это формат YAML.

Я обнаружил, что время обновления нового кода node.js в среде t1.micro сократилось с 5 минут до 90 секунд, теперь, когда он не устанавливал все devDependencies, такие как grunt, karma, mocha, и т.д.

Ответ 3

Дополнительная опция - использовать npm-shrinkwrap, что дает дополнительное преимущество, позволяя вам одновременно блокировать ваши зависимости.

AWS Elastic Beanstalk предлагает его здесь.

Ответ 4

В новых версиях стеков с эластичным 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 по по умолчанию.

Для тех, кто хочет отключить его (как я был, когда я пошел на этот ответ), вы должны создать anything.config внутри папки .ebextensions в корневой папке проекта ( где что-либо означает действительно что-либо: node, npm, что угодно), с содержимым:

option_settings:
    - namespace: aws:elasticbeanstalk:application:environment
      option_name: NPM_USE_PRODUCTION
      value: false