Получение поддержки RGeo GEOS для работы в приложении Rails, развернутом в Dokku

У меня есть приложение rails, использующее гем RGeo, и мне трудно установить гем с поддержкой базовой библиотеки GEOS, которая необходима для правильной работы моего приложения.

Как правило, вы можете запустить RGeo::Geos.supported? с консоли рельсов, и он вернется true если GEOS поддерживается, false иначе. Это работает на моей машине devel (OS X), но всегда возвращает false на моем Dokku контейнере.

Я использую пакеты сборки, чтобы вытащить эти библиотеки, вот содержимое моего .buildpack file:

https://github.com/cyberdelia/heroku-geo-buildpack.git#1.3
https://github.com/heroku/heroku-buildpack-ruby.git#v141

Это, кажется, по крайней мере частично работает, так как гем собирает библиотеку PROJ.4. Это можно проверить, запустив RGeo::CoordSys::Proj4.supported? в консоли рельсов, которая возвращает true на моем развертывании Dokku.

При развертывании приложения пакет сборки работает без проблем:

-----> Cleaning up...
-----> Building demoapp from herokuish...
-----> Adding BUILD_ENV to build environment...
-----> Multipack app detected
=====> Downloading Buildpack: https://github.com/cyberdelia/heroku-geo-buildpack.git
=====> Detected Framework: geos/gdal/proj
   Using geos version: 3.4.2
   Using gdal version: 1.11.1
   Using proj version: 4.8.0_1
-----> Vendoring geo libraries done
=====> Downloading Buildpack: https://github.com/heroku/heroku-buildpack-ruby.git
=====> Detected Framework: Ruby
-----> Compiling Ruby/Rails
-----> Using Ruby version: ruby-2.2.3
-----> Installing dependencies using bundler 1.9.7
   Running: bundle install --without development:test --path vendor/bundle --binstubs vendor/bundle/bin -j4 --deployment

Я использую последнюю версию Dokku (0.4.10), и приложение в настоящее время работает на Ruby 2.2.3, Rails 4.2.5.

Редактировать (для пояснения): мне нужен этот вызов метода (RGeo::Geos.supported?) возвращать true в консоли рельсов в моем контейнере приложения. Только тогда мое приложение будет работать правильно, в настоящее время оно возвращается false Это означает, что гем RGeo не нашел библиотеку GEOS (libgeos) во время установки. Во время развертывания ошибок нет, и вывод журнала (соответствующий раздел включен выше) сообщает, что GEOS 3.4.2 установлен через buildpack. Без поддержки GEOS я не могу даже заполнить свою базу данных, так как часть этого процесса включает чтение в шейп-файлах и сохранение их в виде геометрии через PostGIS. Мое приложение также использует много других функций, которые требуют GEOS через RGeo, так что это требование, которое RGeo::Geos.supported? возвращается true в консоли, что означает, что GEOS доступен через гем RGeo, и такие функции, как чтение в шейп-файлах и т. д. будут работать.

1 ответ

Решение

Как отметил Хосе в комментариях, вы можете использовать плагин apt-get для установки пакетов в ваш контейнер во время развертывания. Это позволяет полностью обойти текущие проблемы с гео buildpack.

После установки плагина в мой экземпляр Dokku я создал apt-packages файл в корне моего проекта со следующим содержимым:

libgeos-dev
libgeos++-dev
libgdal-dev
libproj-dev

Я удалил гео buildpack (https://github.com/cyberdelia/heroku-geo-buildpack.git#1.3) от моего .buildpacks файл, так как он больше не используется. Теперь можно полностью избавиться от файла.buildpacks и просто создать BUILDPACK_URL переменная окружения dokku config:set указывая на рубиновый репозиторий buildpack.

После развертывания гем RGeo теперь сообщает, что GEOS доступен, поскольку теперь он может создавать собственные расширения во время установки:

irb(main):001:0> RGeo::Geos.supported?
=> true

PROJ.4 все еще работает, так как я включил библиотеку в apt-packages файл:

irb(main):002:0> RGeo::CoordSys::Proj4.supported?
=> true
Другие вопросы по тегам