这看起来很简单,但我似乎无法弥补最后的差距。我最近通过GSL向基于Heroku的应用添加了Heroku buildpack for GSL/Ruby。 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
,但后来我从Heroku收到Error: No such file or directory
错误。
我查看了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链接器找不到二进制文件......
编辑:是的,我还在这一个......这是新信息。
我找到this可能的答案并将我的库路径设置为libgsl.so.0文件的位置,如下所示:
$heroku config:add LD_LIBRARY_PATH=/app/vendor/gsl-1
没有bueno。同样的崩溃。
然后我注意到“丢失的”库文件也位于/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
目录。有时你可以如此接近,但到目前为止。希望这个答案能够帮助将来的某个人......
答案 0 :(得分:2)
答案是如下设置配置变量:
LD_LIBRARY_PATH=/app/vendor/gsl-1/lib