2014-05-14 217 views
0

我在我的Rails应用中使用手工制作的宝石,它本身对我需要替换为Ruby版本> = 2.0的宝石有依赖性。在红宝石宝石中使用不同的宝石依赖

我发现了一个很好的方式来动态注入依赖关系by using Gem extensions

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应用程序内这种宝石(宝石文件中平原参考:

安装我的sudo gem install ...的作品就好了宝石,依赖性会根据内部mkrf_conf.rb我的红宝石版本安装条件)。我没有在我的开发虚拟机上使用rvm,所有gem都驻留在系统gem路径中。通常,bundler在安装新宝石时要求输入sudo密码(运行Ubuntu)。当我想现在捆绑,捆绑失败建设本土创业板的扩展,由于insufficiant权限:

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,并且这些将被正确构建。此外,捆绑商手册页指出,使用sudo bundle开始捆绑销售商是需要避免的。

是我试图注入依赖到我的宝石取决于Ruby版本的方式不是要走的路?

任何提示或帮助真的很感激。

回答

0

问题是你用sudo(超级用户权限)安装你的gem,那么你不能访问它,使用RVM并安装没有sudo的gem它将解决你的问题。