我在我的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版本而不是剩下的方式吗?
非常感谢任何提示或帮助。