我正在将生产应用程序从竹栈迁移到雪松,我成功地将应用程序推送到雪松,但导致错误如下

LoadError: Could not open library 'lib.so': lib.so: cannot open shared object file: No such file or directory
from /app/vendor/bundle/ruby/1.9.1/gems/ffi-1.0.9/lib/ffi/library.rb:75:in `block in ffi_lib'
from /app/vendor/bundle/ruby/1.9.1/gems/ffi-1.0.9/lib/ffi/library.rb:54:in `map'
from /app/vendor/bundle/ruby/1.9.1/gems/ffi-1.0.9/lib/ffi/library.rb:54:in `ffi_lib'

0.1.3/lib/tidy_ffi/interface.rb:5:in `'

看起来像竹栈上存在的雪松栈上缺少一些本地库。就我而言,它是 libtidy.so 。

我怎样才能解决这个问题?

最佳答案

Bamboo stack 和 Cedar stack 在包含的内容方面有很大的不同。但是底层的 linux 内核和架构是相同的,因此复制文件应该是安全的

(local)$ heroku run bash --app bamboo-app-name
(remote)$ uname -a
  Linux  2.6.32-316-ec2 #31-Ubuntu SMP Wed May 18 14:10:36 UTC 2011 x86_64 GNU/Linux
(local)$ heroku run bash --app cedar-app-name
(remote)$ uname -a
  Linux  2.6.32-316-ec2 #31-Ubuntu SMP Wed May 18 14:10:36 UTC 2011 x86_64 GNU/Linux

假设您的应用程序使用 tidy_ffi gem,它需要共享对象文件 libtidy.so 存在于/usr/lib 中。

在雪松中,任何像 TidyFFI::Tidy.new("Hello") 这样的调用都会失败
LoadError: Could not open library 'lib.so': lib.so: cannot open shared object file: No such file or directory

要修复它,您可以从竹子中获取 libtidy.so 的副本(您可以为此使用 scp 到任何远程框)并将其提交到您的存储库中(可能位于 RAILS_ROOT/lib/native)并将以下行添加到 environment.rb
ENV['LD_LIBRARY_PATH'] ||="/usr/lib"
ENV['LD_LIBRARY_PATH'] +=":/app/lib/native"

这将使 tidy_ffi gem 查找共享库的 lib/native。
将这些更改推送到 cedar 应用程序,一切正常。

关于ruby - 从 Heroku Bamboo 迁移到 Cedar 堆栈时,缺少一些本地库!如何解决?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7357760/

10-09 17:54