php, node в одном проекте на heroku

При разворачивании проекта с идеями из поста "NODE ЗАВИСИМОСТИ В PHP ПРОЕКТЕ" на heroku, наткнулся на невозможность собрать проект из-за некоторых особенностей этого хостинга.

Особенность 1 buildpack

Когда в админке heroku или из консоли создается приложение, то для него указывается так называемый buuldpack. По сути buuldpack это набор скриптов и файлов конфигурации, которые собирают приложение. В самом простом случае добавляется только php, например:

heroku buildpacks:set heroku/php

Если в таком виде попробовать задеплоить приложение, то произойдет следущее:

  • Heroku, зная что ему надо работать с php, инициализирует его окружение
  • Находит файлик composer.json, выполняет его
  • Composer натыкается на зависимости от npm, пытается их поставить
  • Все падает т.к. heroku ничего не говорили про nodejs.

Соответственно нужно добавить ноду

heroku buildpacks:set heroku/nodejs

Но это не даст результатов и действия будут точно такимиже т.к. node не инициализирована.

На помощь приходит команда

heroku buildpacks:set heroku/php --index 2

Эта команда говорит heroku подвинуть порядок инициализации php окружения. Таким образом сначала появиться нода, потом php и деплой пройдет успешно.

Эту команду можно и не выполнять, а просто поменять порядок в вебинтерфейсе на вкладке settings.

Особенность 2 package.json 

Так как в корне проекта лежит файлик package.json, нода инициализирована, она пытается выполнить yarn или npm для установки зависимостей. А в качестве зависимостей указан файл, который должен сгенерировать пакет foxy, когда инициализируется php. Разорвать циклические зависимости можно удалив сгенерированную foxy зависимость из корневого package.json. Тперь порядок загрузки будет такой:

  • Heroku инициализирует node
  • Находит файлик package.json, выполняет его. Т.к. там нет зависимостей идет дальше
  •  Инициализирует php
  • Находит файлик composer.json, выполняет его
  • Foxy генерирует файлик с зависимостями и запихивает его в корневой package.json
  • Выполняется yarn или npm
  • Проект разворачивается

Теги:

node heroku php