Установка правильного пути на Heroku для библиотеки поставщиков

Это кажется таким простым, но я не могу закрыть этот последний пробел. Недавно я добавил GSL в свое приложение на основе Heroku через сборочный пакет Heroku для GSL/Ruby. Как buildpack, так и связанный с ним гем GSL, по-видимому, устанавливаются очень хорошо, как показано в сокращенном выводе push-уведомлений ниже:

$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, и двоичные библиотеки GSL, а компоновщик Heroku не может найти двоичный файл...

EDIT: Да, я все еще на этом... Вот новая информация.

Я нашел это возможный ответ и указать путь к библиотеке для файла libgsl.so.0 следующим образом:

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

Нет буэно. Та же авария.

Затем я заметил, что «отсутствующий» файл библиотеки также находится в каталоге /usr/lib32. Думая, что Heroku, возможно, не загружает lib32 (а просто загружает lib), я нашел отличный пост (очевидно, у меня нет репутации, чтобы опубликовать ссылку) о разнице между путями автозагрузки и нетерпеливого_загрузки, что побудило меня добавить следующий стремительный_загрузочный_путь к мой файл application.rb:

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

Не хорошо.

Я буду продолжать искать и буду признателен за любую помощь.

ИЗМЕНИТЬ

С некоторой быстрой помощью от Heroku оказалось, что я был очень близок к решению, которое заключалось в том, чтобы установить переменную конфигурации LD_LIBRARY_PATH=/app/vendor/gsl-1/lib. Мне просто не хватало каталога /lib. Иногда ты можешь быть так близко, но так далеко. Надеюсь, этот ответ поможет кому-то в будущем...


person Robert Vizza    schedule 03.04.2014    source источник
comment
Ваш ответ в нижнем редактировании сработал для меня (установка переменной конфигурации). Вы должны представить это как ответ, поскольку я думаю, что люди могут пропустить это, скрытое в нижней части вопроса.   -  person diasks2    schedule 02.08.2014
comment
Спасибо, diasks2 ... Я все еще достаточно новичок в StackExchange, поэтому я не понял, что могу ответить на свои вопросы ...   -  person Robert Vizza    schedule 02.08.2014


Ответы (1)


Ответ заключается в том, чтобы установить переменную конфигурации следующим образом:

LD_LIBRARY_PATH=/app/vendor/gsl-1/lib
person Robert Vizza    schedule 02.08.2014