让 RGeo GEOS 支持在部署到 Dokku 的 Rails 应用程序中工作

Getting RGeo GEOS support to work in a Rails app deployed to Dokku

我有一个 rails 应用程序,它使用我的应用程序正常工作所需的 RGeo gem and I'm having a hard time getting the gem to install with support for the underlying GEOS library

通常,您可以从 rails 控制台 运行 RGeo::Geos.supported? 如果支持 GEOS,它将 return truefalse 否则。这适用于我的开发机器 (OS X),但在我的 Dokku 容器上总是 returns false

我正在使用构建包来拉入这些库,这是我的 .buildpack file:

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

这似乎至少部分起作用,因为 gem 正在获取 PROJ.4 库。这可以通过 rails 控制台中的 运行ning RGeo::CoordSys::Proj4.supported? 检查,在我的 Dokku 部署中 returns true

当我部署应用程序时,构建包似乎可以正常工作:

-----> 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 上运行。

编辑(澄清):我需要在我的应用程序容器的 rails 控制台中将此方法调用 (RGeo::Geos.supported?) 到 return true。只有这样我的应用程序才能正常工作,目前它是 returning false 这意味着 RGeo gem 在安装过程中没有找到 GEOS (libgeos) 库。部署期间没有错误,日志输出(上面包含的相关部分)报告说 GEOS 3.4.2 是通过 buildpack 安装的。没有 GEOS 支持,我什至无法为我的数据库播种,因为该过程的一部分涉及读取 shapfile 并通过 PostGIS 将它们存储为几何图形。我的应用程序还使用许多其他需要通过 RGeo GEOS 的功能,因此要求 RGeo::Geos.supported? returns true 在控制台中,这意味着 GEOS 可通过 RGeo gem 获得,并且可以使用读取 shapefile 等功能。

正如何塞在评论中指出的那样,您可以完全使用 apt-get plugin to install packages into your container during deployment. This allows you to bypass the current problems with the geo buildpack

将插件安装到我的 Dokku 实例后,我在项目的根目录中创建了一个 apt-packages 文件,内容如下:

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

我从我的 .buildpacks 文件中删除了地理构建包 (https://github.com/cyberdelia/heroku-geo-buildpack.git#1.3),因为它不再被使用。现在可以完全删除 .buildpacks 文件,只需创建一个指向 ruby buildpack 存储库的 BUILDPACK_URL 环境变量 dokku config:set

部署后,RGeo gem 现在报告 GEOS 可用,因为它现在能够在安装期间构建本机扩展:

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

PROJ.4 仍然有效,因为我将库包含在 apt-packages 文件中:

irb(main):002:0> RGeo::CoordSys::Proj4.supported?
=> true