Ruby Bundler sqlite3扩展依赖于用户文件夹中的本地libruby

问题描述

操作系统:macosbrew

Ruby版本管理器:rbenv

我正在使用bundler(2.1.4)来部署具有所有必需gem的应用程序。

我当前正在使用Ruby 2.2.4,并尝试更新到Ruby 2.5.5。我还将各种宝石更新到最新版本。

我遇到bundler的问题,该问题为libruby.2.5.dylib上的编译扩展引入了依赖性。该库位于本地用户文件夹中的本地.rbenv文件夹中。这会导致该应用程序在其他用户的计算机上启动时失败,因为该文件当然不可用。

有趣的是,以前的Ruby版本(2.2.4)并未发生这种情况。例如,如果您使用sqlite3,我将得到以下信息。

Ruby 2.2.4和sqlite-ruby 1.3.13

otool -L /Users/dev-user/dev/MCTools/src/mct-tools/ext/gems/ruby/2.2.0/extensions/x86_64-darwin-19/2.2.0-static/sqlite3-1.3.13/sqlite3/sqlite3_native.bundle
/Users/dev-user/dev/MCTools/src/mct-tools/ext/gems/ruby/2.2.0/extensions/x86_64-darwin-19/2.2.0-static/sqlite3-1.3.13/sqlite3/sqlite3_native.bundle:
        /usr/lib/libsqlite3.dylib (compatibility version 9.0.0,current version 308.4.0)
        /usr/lib/libSystem.B.dylib (compatibility version 1.0.0,current version 1281.100.1)
        /usr/lib/libobjc.A.dylib (compatibility version 1.0.0,current version 228.0.0)

Ruby 2.5.5和sqlite-ruby 1.4.2

otool -L /Users/dev-user/dev/MCTools/src/mct-tools/ext/gems/ruby/2.5.0/extensions/x86_64-darwin-19/2.5.0/sqlite3-1.4.2/sqlite3/sqlite3_native.bundle
/Users/dev-user/dev/MCTools/src/mct-tools/ext/gems/ruby/2.5.0/extensions/x86_64-darwin-19/2.5.0/sqlite3-1.4.2/sqlite3/sqlite3_native.bundle:
        /Users/dev-user/.rbenv/versions/2.5.5/lib/libruby.2.5.dylib (compatibility version 2.5.0,current version 2.5.5)
        /usr/lib/libsqlite3.dylib (compatibility version 9.0.0,current version 308.5.0)
        /usr/lib/libSystem.B.dylib (compatibility version 1.0.0,current version 228.0.0)

如您所见,现在有一个依赖项

/Users/dev-user/.rbenv/versions/2.5.5/lib/libruby.2.5.dylib (compatibility version 2.5.0,current version 2.5.5)

当然,它在其他计算机上不可用。这种行为对于所有已编译的gem都是常见的(我有5个)。

我希望bundle package会有所帮助,但是如果我在bundle install之前运行它,将会得到相同的结果。

关于如何删除此依赖项或任何其他替代解决方案的想法?

解决方法

编译Ruby时,可以将--enable-load-relative标志传递给./configure,以从编译的二进制文件中删除(某些?)绝对路径。这也可能会影响扩展。