当我想将已安装的gem从一个安装复制到另一个安装(不使用gem命令)时,该怎么办?
我必须在没有Internet连接的服务器上安装sqlite3。通常,我可以使用gem文件的副本来做到这一点:
gem install --local sqlite3-1.4.0.gem --platform ruby
但是对于sqlite3,它需要连接到Internet才能使库编译一些二进制文件。
该安装在具有互联网的计算机上运行良好。因此,我的想法是成功安装(相同的操作系统和相同的ruby版本)并复制所有相关组件。
但这没用。
当我调用以下命令时
require 'sequel'
db = Sequel.sqlite
然后出现以下错误:
LoadError: The specified module could not be found
d:/bin/Ruby26-x64/lib/ruby/gems/2.6.0/gems/sqlite3-1.4.1/lib/sqlite3/sqlite3_native.so
(Sequel::AdapterNotFound)
详细信息:
d:/bin/Ruby26-x64/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require': LoadError: 126: The specified module could not be found. - d:/bin/Ruby26-x64/lib/ruby/gems/2.6.0/gems/sqlite3-1.4.1/lib/sqlite3/sqlite3_native.so (Sequel::AdapterNotFound)
from d:/bin/Ruby26-x64/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
from d:/bin/Ruby26-x64/lib/ruby/gems/2.6.0/gems/sqlite3-1.4.1/lib/sqlite3.rb:6:in `rescue in <top (required)>'
from d:/bin/Ruby26-x64/lib/ruby/gems/2.6.0/gems/sqlite3-1.4.1/lib/sqlite3.rb:2:in `<top (required)>'
from d:/bin/Ruby26-x64/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:130:in `require'
from d:/bin/Ruby26-x64/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:130:in `rescue in require'
from d:/bin/Ruby26-x64/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:34:in `require'
from d:/bin/Ruby26-x64/lib/ruby/gems/2.6.0/gems/sequel-5.17.0/lib/sequel/adapters/sqlite.rb:3:in `<top (required)>'
from d:/bin/Ruby26-x64/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
from d:/bin/Ruby26-x64/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
from d:/bin/Ruby26-x64/lib/ruby/gems/2.6.0/gems/sequel-5.17.0/lib/sequel/database/connecting.rb:88:in `load_adapter'
from d:/bin/Ruby26-x64/lib/ruby/gems/2.6.0/gems/sequel-5.17.0/lib/sequel/database/connecting.rb:17:in `adapter_class'
from d:/bin/Ruby26-x64/lib/ruby/gems/2.6.0/gems/sequel-5.17.0/lib/sequel/database/connecting.rb:45:in `connect'
from d:/bin/Ruby26-x64/lib/ruby/gems/2.6.0/gems/sequel-5.17.0/lib/sequel/core.rb:121:in `connect'
from d:/bin/Ruby26-x64/lib/ruby/gems/2.6.0/gems/sequel-5.17.0/lib/sequel/core.rb:399:in `adapter_method'
from d:/bin/Ruby26-x64/lib/ruby/gems/2.6.0/gems/sequel-5.17.0/lib/sequel/core.rb:406:in `block (2 levels) in def_adapter_method'
from _ruby_version.rb:21:in `<main>'
但是文件存在:
我的错误是什么?
如果有兴趣:我使用Win Server 2016。
我在precompiled version of sqlite3中发现了一个github issue(对我有用)。但是我想使用较新的版本。
答案 0 :(得分:1)
为此使用Bundler。
简而言之:
gem install bundler
。Gemfile
bundle install
,并运行bundle update
更新到最新版本。这将生成Gemfile.lock文件。bundle exec
前缀执行ruby,例如bundle exec ruby myscript
或bundle exec rails c
这是一个简短的摘要,但请阅读有关Bundler的更多信息。这是现代Ruby部署的重要组成部分。
答案 1 :(得分:1)
您需要使用捆绑器的package
选项。
首先,您需要使用以下命令将依赖项缓存到vendor/cache
中:
bundle package --all --all-platforms
这将在本地安装Gemfile
的所有依赖项,然后将目录添加到源代码存储库。
部署时,请确保使用bundle install --local
使用本地版本。
捆绑包中的文档为here