将rubygem从一个安装复制到另一个安装需要什么?

时间:2019-06-17 10:13:04

标签: ruby sqlite sequel

当我想将已安装的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>'

但是文件存在:

File structure

我的错误是什么?

如果有兴趣:我使用Win Server 2016。

结束语

我在precompiled version of sqlite3中发现了一个github issue(对我有用)。但是我想使用较新的版本。

2 个答案:

答案 0 :(得分:1)

为此使用Bundler

简而言之:

  • 在使用的每台计算机上运行gem install bundler
  • 维护一个列出所有要求的项目Gemfile
  • 当您的Gemfile更改时运行bundle install,并运行bundle update更新到最新版本。这将生成Gemfile.lock文件。
  • 使用bundle exec前缀执行ruby,例如bundle exec ruby myscriptbundle exec rails c

这是一个简短的摘要,但请阅读有关Bundler的更多信息。这是现代Ruby部署的重要组成部分。

答案 1 :(得分:1)

您需要使用捆绑器的package选项。

首先,您需要使用以下命令将依赖项缓存到vendor/cache中:

bundle package --all --all-platforms

这将在本地安装Gemfile的所有依赖项,然后将目录添加到源代码存储库。

部署时,请确保使用bundle install --local使用本地版本。

捆绑包中的文档为here