Недавно мы пытались развернуть последнюю версию Gurn, используя флаг NODE_ENV, установленный на production, на первый взгляд это имеет смысл. Сейчас мы находимся в производстве, поэтому мы хотим убедиться, что все работает так, как будто оно находится в производстве. Однако это вызывает проблемы при работе с gulp и typescript.

В настоящее время мы запускаем нашу сборку TypeScript на этапах развертывания Elastic Beanstalk непосредственно перед запуском приложения. Мы делаем это через gulp.

Ошибка, которую мы получали, была:

[11:55:22] Local gulp not found in /var/app/current
[11:55:22] Try running: npm install gulp
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! @gradient/[email protected] start: `gulp && node ./dist/index`
npm ERR! Exit status 1
npm ERR! 
npm ERR! Failed at the @gradient/[email protected] start script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

В нашей среде NODE_ENV установлено на production, а NPM_USE_PRODUCTION установлено на false. Переменная среды NPM_USE_PRODUCTION добавляется Elastic Beanstalk и действует только для того, чтобы задать вопрос о том, следует ли добавить флаг --production на этапе установки NPM. Однако, как указано в Документах NPM

С флагом --production (или когда для переменной среды NODE_ENV установлено значение production), npm не будет устанавливать модули, перечисленные в devDependencies.

Как оказалось, NODE_ENV на самом деле имеет приоритет, а это означает, что gulp и наши типы TypeScript не устанавливались, и, следовательно, gulp не существовал локально.

Мы решили использовать NODE_ENV=live сейчас вместо production, это поможет нам избежать поведения по умолчанию, но гарантирует, что у нас все еще есть что-то, за что можно зацепиться в нашей системе, чтобы увидеть, находимся ли мы на клиентском сервере.

Конечная цель, к которой мы сейчас будем стремиться, — это переход от TypeScript к JavaScript на нашем CI (circle-ci), а затем отправка этого в Elastic Beanstalk, но мы еще не достигли этого!