Один из моих подопечных здесь, в codementor.io возникла проблема при запуске Python и Ruby вместе на Героку . Эта сессия вдохновила меня на написание этого учебника—как запустить более одной среды на Heroku.
ПРОБЛЕМА
Проект работал в Cloud 9 без каких-либо проблем. Однако после развертывания в Heroku в журнале отображались сообщения об ошибках, связанных с проблемами Python. Стив написал скребок на Python, и он не работал. Стив, мой подопечный, создал старую тестовую среду в облаке 9, чтобы я работал над его проблемой.
РЕШЕНИЕ
Это решение использует это руководство от Heroku.
Я решил эту проблему, используя Heroku multi-buildpacks для Python и Ruby.
Heroku multi-buildpack
Пакеты сборки отвечают за настройку вашего приложения. Heroku объясняет пакеты сборки в своей документации следующим образом: “Пакеты сборки состоят из набора сценариев, и в зависимости от языка программирования сценарии будут извлекать зависимости, выводить сгенерированные ресурсы или скомпилированный код и многое другое. Этот вывод собирается в slug компилятором slug.”
Есть много пакетов сборки (многие из них можно увидеть здесь и здесь ). Существуют различные пакеты сборки для Ruby и Python .
Итак, если кто-то хочет развернуть Ruby и Python вместе на Heroku, ему нужно использовать “несколько пакетов сборки” . Таким образом, Heroku будет использовать различные пакеты сборки для запуска вашего приложения. Каждый пакет сборки создает отдельную среду.
Запуск приложений с профилем
Приложение Стива должно работать на сервере Puma ( веб-сервер по умолчанию Ruby on Rails ). Итак, мне нужно было создать Профиль
. Профиль автоматически выполняет команды после развертывания. Профили отвечают за запуск шелл-кода на Heroku после развертывания. Например, вы можете запустить веб-серверы и длительные задачи. Подробнее см. здесь .
Итак, я создал файл профиля, подобный этому, в корне его проекта:
# Procfile web: bundle exec rails server -p $PORT worker: python scraper.py
В нескольких пакетах сборки порядок пакетов сборки имеет решающее значение.
Мне нужно было добавить Ruby buildpack в качестве последнего, потому что Стив будет запускать веб-сервер Puma для Ruby. Если бы я этого не сделал, Стив не смог бы запустить свой рубиновый сервер на Heroku. Итак, я сначала добавил Python buildpack, а затем добавил Ruby buildpack позже. Вместе они становятся “могучим множественным пакетом сборки”, готовым к использованию на Heroku.
# command line commands heroku buildpacks:clear # remove all of the buildpacks first heroku buildpacks:add heroku/python # add the python buildpack first heroku buildpacks:add heroku/ruby # add the ruby buildpack second heroku buildpacks # to see what I have done # === golden-ratio-1618 Buildpack # 1. heroku/python # 2. heroku/ruby
Внутренние части пакета сборки
Чтобы узнать больше о внутренних компонентах пакета сборки, вы можете просмотреть исходный код пакета сборки на Github, например, файл Ruby . bin/detect
. Вы можете просмотреть исходный код этого файла, чтобы узнать, что необходимо Heroku для развертывания вашего приложения. Например, для Ruby вам нужно создать Gemfile
в корневом каталоге вашего приложения, иначе он выйдет из строя.
Необходимые пакеты отсутствовали
Однако после добавления всех пакетов сборки проект еще не функционировал на Heroku. Это было из-за Python requirements.txt
файл. Файл отвечает за добавление необходимых пакетов Python в ваше приложение, которые будут автоматически устанавливаться на Heroku после каждого развертывания ( like Gemfile
в Ruby ). Каждый раз при развертывании Heroku запускает новый экземпляр и инициализирует его, запустив эти файлы. Они являются необходимыми файлами для сред, таких как Python и Ruby.
Мне также нужно было проверить поведение в локальном, поэтому я запустил pip install-r requirements.txt
в качестве команды для установки необходимых пакетов на локальный сервер.
Кроме того, я протестировал настройку с помощью команды: heroku local
. Подробнее об этом здесь .
Я поместил необходимые пакеты, посмотрев на код заголовка скребков Python. Одним из них был lxml
. Я нашел его номер последней версии, посмотрев на его страницу github ( к тегам ).
Итак, мы создали requirements.txt файл, подобный этому:
# requirements.txt file lxml==3.6.4
Итак, после проведения тренировки Стив ответил так::
Вывод
В этой статье моя цель состояла в том, чтобы показать, как я справился с запросом подопечного, и рассказать вам о том, как запускать несколько пакетов сборки на Heroku. Конечно, есть много деталей, которые я пропустил. Возможно, это могут быть темы следующей статьи. Аналогичным образом, вы также можете прочитать дополнительные руководства по Heroku, например: как анализировать панель мониторинга Heroku или как получать push-уведомления при развертывании приложения Heroku . Увидимся в следующий раз.