我为运行我的ruby测试定义了一个简单的rake任务,但是有一个问题,rake没有加载Gemfile中定义的版本的gem。得到Gem::LoadError
。有没有办法告诉rake使用哪个宝石版本?
以下是我系统上安装的宝石:
addressable (2.2.6, 2.2.4)
bundler (1.0.15)
libarchive (0.1.2)
nokogiri (1.5.0)
rake (0.9.2, 0.8.7)
rdf (0.3.3)
这是我的GemFile:
source :rubygems
gem 'nokogiri', '1.5.0'
gem 'rdf', '0.3.3'
gem 'addressable', '2.2.4'
gem 'libarchive', '0.1.2'
这里是rake任务:
require 'rake/testtask'
task :default => [:test]
desc "Run basic tests"
Rake::TestTask.new do |test|
test.libs << "test"
test.test_files = Dir["test/test_*.rb"]
test.verbose = true
end
这是我得到的例外:
/Users/dummy/.rvm/rubies/ruby-1.9.2-head/lib/ruby/site_ruby/1.9.1/rubygems/specification.rb:1612:in `raise_if_conflicts': Unable to activate rdf-0.3.3, because addressable-2.2.6 conflicts with addressable (= 2.2.4) (Gem::LoadError)
我可以通过卸载addressable 2.2.6
来解决问题,但我需要另一个项目的永久版本的gem。
另一种解决方案可能是使用rvm gemsets。但是不是可以用给定的Gemfile规范运行rake吗?
由于
答案 0 :(得分:2)
我认为布莱恩的建议确实应该成功:
bundle exec rake <task>
此外,使用例如rvm gemsets对gemsets进行分区将是另一种选择......不应该需要卸载任何gem版本。
另一种分区技术是在项目目录中安装所有宝石 (而不是将它们安装为系统宝石),使用类似于:
的东西bundle install --path=.bundler
有关详细信息,请参阅http://gembundler.com/man/bundle-install.1.html。请注意,后一种解决方案仍然需要bundle exec
方法来避免gem冲突。
希望这有帮助,
彼得
答案 1 :(得分:0)
使用RVM gemsets(http://beginrescueend.com/gemsets/basics/)可能是处理跨项目的gem版本冲突的最佳方法。对于我的场景,它有效......