Ruby程序化安装gem

3

如果我使用脚本中的反引号以编程方式安装gem,命令为gem install gem_name

if not_gem_installed
  `gem install my_gem`
end

require 'my_gem'

当调用gem时,会出现LoadError错误。有什么方法可以修复这个问题吗?


尝试更新 Ruby 版本。 - Yunus Hatipoglu
你在 Gemfile 中添加了 require 'rubygems' 吗? - Yunus Hatipoglu
@YunusHatipoglu 我正在使用反引号编程方式安装gem程序。 - Amal
请在您“require” gem并引发LoadError的位置添加Ruby代码。 - Uzbekjon
@Uzbekjon,我已经更新了我的问题,包括代码。 - Amal
2个回答

5

我尝试用反引号安装gems,发现我遇到了问题,就像问题中提到的一样。我认为这不是这项工作的最佳选择。 我建议使用Gem来搜索gems并进行安装。

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 - 包含优秀示例的代码片段


1
我认为原因可能是因为使用反引号时,命令在子shell中执行,当前运行脚本的环境不会更新。 - Amal

-1

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

if not_gem_installed
  `gem install my_gem`
end

require 'path/to/my_gem'

你可以通过在文件/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", "..."]

或者

你可以在你的脚本中简单地使用bundler。

if not_gem_installed
  `gem install my_gem`
end

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接