5

这看起来很简单,但我似乎无法缩小这最后的差距。我最近通过Heroku buildpack for GSL/Ruby将GSL添加到基于 Heroku 的应用程序中。根据以下缩写的推送输出,buildpack 和相关的 GSL gem 似乎都可以正常安装:

$git push staging master
Fetching repository, done.
Counting objects: 7, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 476 bytes, done.
Total 4 (delta 3), reused 0 (delta 0)

-----> Fetching custom git buildpack... done
-----> Ruby app detected
-----> Compiling Ruby/Rails
-----> Using Ruby version: ruby-1.9.3
-----> Installing gsl
-----> Installing dependencies using 1.5.2
       Running: bundle install --without development:test --path vendor/bundle --binstubs vendor/bundle/bin -j4 --    deployment
       Fetching gem metadata from https://rubygems.org/........
       Fetching additional metadata from https://rubygems.org/..
       Using builder (3.0.4)
       <...snip...>
       Installing narray (0.6.0.8)
       Installing gsl (1.15.3)
       Your bundle is complete!
       Gems in the groups development and test were not installed.
       It was installed into ./vendor/bundle
       Bundle completed (76.10s)
       Cleaning up the bundler cache.
-----> Writing config/database.yml to read from DATABASE_URL
-----> Preparing app for Rails asset pipeline
       Running: rake assets:precompile
       Running: rake assets:precompile
       Compiled jquery.js  (2ms)  (pid 1884)
       <...snip...>
       Asset precompilation completed (63.31s)
-----> Discovering process types
-----> Compressing... done, 87.4MB
-----> Launching... done, v9

Heroku 日志显示丢失的文件 libgsl.so.0

/app/vendor/bundle/ruby/1.9.1/gems/activesupport-3.2.14/lib/active_support/dependencies.rb:251:in `require': libgsl.so.0: cannot open shared object file: No such file or directory - /app/vendor/bundle/ruby/1.9.1/gems/gsl-1.15.3/lib/rb_gsl.so (LoadError)

但是,丢失的文件确实存在于~/vendor/gsl-1/lib

~/vendor/gsl-1/lib $ ls -l
total 23256
-rw------- 1 u58334 58334 13351772 2012-09-18 02:29 libgsl.a
-rw------- 1 u58334 58334  1781834 2012-09-18 02:26 libgslcblas.a
-rwx------ 1 u58334 58334      954 2012-09-18 02:26 libgslcblas.la
lrwxrwxrwx 1 u58334 58334       20 2014-04-03 17:34 libgslcblas.so -> libgslcblas.so.0.0.0
lrwxrwxrwx 1 u58334 58334       20 2014-04-03 17:34 libgslcblas.so.0 -> libgslcblas.so.0.0.0
-rwx------ 1 u58334 58334  1052844 2012-09-18 02:26 libgslcblas.so.0.0.0
-rwx------ 1 u58334 58334      922 2012-09-18 02:29 libgsl.la
lrwxrwxrwx 1 u58334 58334       16 2014-04-03 17:34 libgsl.so -> libgsl.so.0.16.0
lrwxrwxrwx 1 u58334 58334       16 2014-04-03 17:34 libgsl.so.0 -> libgsl.so.0.16.0
-rwx------ 1 u58334 58334  7603609 2012-09-18 02:29 libgsl.so.0.16.0
drwx------ 2 u58334 58334     4096 2012-09-18 02:29 pkgconfig

我试过heroku config:set PATH=/vendor/gsl-1/lib --app vp-staging了,但后来我得到了Error: No such file or directory从 Heroku 收到错误消息。

我查看了 Heroku 文档和 stackoverflow,但不知道应该设置哪个环境变量来将 Heroku 引导到供应商库位置。在此先感谢您帮助缩小这一差距...

编辑

另请注意,rb_gsl.so 文件存在如下:

~/vendor/bundle/ruby/1.9.1/gems/gsl-1.15.3/lib $ ls -l
total 3968
drwx------ 2 u13339 13339    4096 2014-04-03 18:00 gsl
-rw------- 1 u13339 13339      59 2014-04-03 18:00 gsl.rb
drwx------ 2 u13339 13339    4096 2014-04-03 18:00 ool
-rw------- 1 u13339 13339     797 2014-04-03 18:00 ool.rb
-rw------- 1 u13339 13339      59 2014-04-03 18:00 rbgsl.rb
-rwx------ 1 u13339 13339 4039311 2014-04-03 18:01 rb_gsl.so

所以看来我已经正确安装了 GSL gem 和 GSL 二进制库,而 Heroku 链接器找不到二进制文件......

编辑:是的,我还在这个......这是新信息。

我找到了这个潜在的答案并将我的库路径设置为 libgsl.so.0 文件的位置,如下所示:

$heroku config:add LD_LIBRARY_PATH=/app/vendor/gsl-1

没有布埃诺。同样的崩溃。

然后我注意到“丢失”的库文件也位于/usr/lib32目录中。考虑到 Heroku 可能没有加载 lib32(而只是加载 lib),我发现了一篇很棒的帖子(显然我没有发布链接的声誉)关于 autoload 和 eager_load 路径之间的区别,导致我将以下 eager_load_path 添加到我的 application.rb 文件:

config.eager_load_paths += %W(#{config.root}/lib #{config.root}/lib32)

不好。

我会继续搜索并感谢任何帮助。

编辑

在 Heroku 的一些快速帮助下,事实证明我非常接近解决方案,即设置LD_LIBRARY_PATH=/app/vendor/gsl-1/lib我只是缺少/lib目录的配置变量。有时你可以如此接近,但如此遥远。希望这个答案能帮助将来的人......

4

1 回答 1

2

答案是按如下方式设置配置变量:

LD_LIBRARY_PATH=/app/vendor/gsl-1/lib
于 2014-08-02T13:44:33.327 回答