Получение поддержки 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