在ruby gem中使用不同的gem依赖项

时间:2014-05-14 15:58:12

标签: ruby-on-rails ruby ruby-on-rails-3 rubygems bundler

我在我的Rails应用程序中使用手工制作的gem,它本身依赖于我需要替换Ruby版本> = 2.0的Gem。

我找到了一种动态注入依赖关系的好方法by using Gem extensions

使用sudo gem install ...安装我的gem工作正常,将根据我在mkrf_conf.rb内的ruby版本条件安装依赖项:

require 'rubygems/dependency_installer'

di = Gem::DependencyInstaller.new

if RUBY_VERSION < '2.0'
  puts "Using vanilla httpclient because of Ruby #{RUBY_VERSION}"
  di.install 'httpclient', '2.3.3'
else
  # https://github.com/nahi/httpclient/pull/163
  puts "Using patched httpclient by glebtv because of Ruby #{RUBY_VERSION}"
  di.install 'glebtv-httpclient', '3.2.7'
end

puts "Writing fake Rakefile"

# Write fake Rakefile for rake since Makefile isn't used
File.open(File.join(File.dirname(__FILE__), 'Rakefile'), 'w') do |f|
  f.write("task :default" + $/)
end

我在我的Rails应用程序中使用此gem(Gem文件中的简单引用)。我没有在我的开发虚拟机上使用rvm,所有宝石都驻留在系统gem路径中。通常,bundler在安装新gem时会要求输入sudo密码(运行Ubuntu)。当我现在尝试捆绑时,由于权限不足,bundler无法构建本机gem扩展:

Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    /usr/local/bin/ruby mkrf_conf.rb
/usr/local/lib/ruby/site_ruby/1.9.1/rubygems/package.rb:359:in `initialize': Permission denied - /usr/local/lib/ruby/gems/1.9.1/gems/httpclient-2.3.3/bin/httpclient (Errno::EACCES)

我绝对不知道如何避免使用sudo运行捆绑程序。据我所知,reading bundler's source,bundler应该检测安装新宝石时是否需要sudo。但我也在我的项目中使用了具有本机C扩展(nokogiri,mysql2,...)的gems,并且这些将正确构建。此外,bundler手册页指出,使用sudo bundle启动捆绑包是值得避免的。

我试图将依赖项注入我的Gem的方式取决于Ruby版本而不是剩下的方式吗?

非常感谢任何提示或帮助。

1 个答案:

答案 0 :(得分:0)

问题是你用sudo安装你的gem(超级用户权限)然后你无法访问它,使用RVM并安装没有sudo的gem它将解决你的问题。