我在我的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版本的方式不是要走的路?
任何提示或帮助真的很感激。