Ruby 以编程方式安装 gem

Ruby programmatically installing a gem

如果我在脚本中使用反引号以编程方式安装 gem gem install gem_name 作为:

if not_gem_installed
  `gem install my_gem`
end

require 'my_gem'

然后要求gem,出现LoadError。有什么办法可以解决这个问题?

由于您没有使用 RubyGems,因此您需要从 gem 的路径中获取特定文件。 RubyGems 覆盖 require 方法,以便它从 Gemfile 中的 gem 路径中查找要包含的路径文件。因此,请确保您为 gem 的主 .rb 文件指定了正确的路径。

if not_gem_installed
  `gem install my_gem`
end

require 'path/to/my_gem'

您可以通过在 file/irb 中打印 $: 的值或通过 运行 gem environment 命令来检查 ruby 将查看的路径命令行。

uzbekjon@mini:~$ gem environment
RubyGems Environment:
  - RUBYGEMS VERSION: 2.5.1
  - RUBY VERSION: 2.3.0 (2015-12-25 patchlevel 0) [x86_64-darwin15]
  - INSTALLATION DIRECTORY: /Users/uzbekjon/.rvm/gems/ruby-2.3.0
  - USER INSTALLATION DIRECTORY: /Users/uzbekjon/.gem/ruby/2.3.0
  - RUBY EXECUTABLE: /Users/uzbekjon/.rvm/rubies/ruby-2.3.0/bin/ruby
  - EXECUTABLE DIRECTORY: /Users/uzbekjon/.rvm/gems/ruby-2.3.0/bin
  - SPEC CACHE DIRECTORY: /Users/uzbekjon/.gem/specs
  - SYSTEM CONFIGURATION DIRECTORY: /Users/uzbekjon/.rvm/rubies/ruby-2.3.0/etc
  - GEM PATHS:
     - /Users/uzbekjon/.rvm/gems/ruby-2.3.0
     - /Users/uzbekjon/.rvm/gems/ruby-2.3.0@global
  - GEM CONFIGURATION:
     ...

=== OR with $: ===

uzbekjon@mini:~$ irb
2.3.0 :001 > $:
 => ["/Users/uzbekjon/.rvm/gems/ruby-2.3.0@global/gems/did_you_mean-1.0.0/lib", "/Users/uzbekjon/.rvm/rubies/ruby-2.3.0/lib/ruby/site_ruby/2.3.0", "..."]

或者

您只需在脚本中使用捆绑器即可。

if not_gem_installed
  `gem install my_gem`
end

require 'rubygems'         # <= This line here
require 'path/to/my_gem'

我尝试安装带有反引号的 gems,发现我遇到了与上述问题相同的问题。我发现这不是这项工作的最佳选择。 我建议使用 Gem 搜索 gem 和安装。

require 'rubygems/commands/install_command'

def find_or_install(gem_name)
  Gem::Specification::find_by_name(gem_name)
rescue Gem::LoadError
  install_gem(gem_name)
end

def install_gem(gem_name)
  cmd = Gem::Commands::InstallCommand.new
  cmd.handle_options [gem_name]     

  cmd.execute
rescue Gem::SystemExitException => e
  puts "FAILURE: #{e.exit_code}"
end

https://gist.github.com/adamjmurray/3154437 - 有很好例子的要点