致电bundle exec rake
或bundle exec make
,我觉得很奇怪:为什么不呢
bundle exec bundle exec rake
然后?
我虽然我应该能够在Rakefile(或Makefile)中要求并使用Bundler。但是,我找不到如何使用正确的宝石组运行测试,以下不起作用:
# Rakefile
require 'rake/testtask'
Rake::TestTask.new do |t|
require 'bundler'
Bundler.setup(:default, :test) # this has no effect
t.test_files = FileList['test.rb']
end
有人可以帮我正确设置Rake测试任务,还是解释使用bundle exec rake
的哲学原因?
请注意,bundle exec rake
需要将gem rake
添加到Gemfile。
答案 0 :(得分:2)
bundle exec
的全部目的是在项目Gemfile
的上下文中运行以下内容。
没有它,对rake
的调用可以使用系统范围内安装的rake和/或gem。这不允许对每个项目中使用的每个gem的哪个版本进行细粒度控制。当您在使用相同gem的不同版本的多个ruby项目中开发(或在生产环境中服务)时,这变得尤为重要。
Bundler允许您的项目自包含,而不对系统可用的依赖项进行任何假设。
话虽这么说,你可以创建一个shell别名,用bundle exec
作为前缀。例如,我的zsh配置(启用了bundler插件)为我提供了be
的{{1}}简写。
答案 1 :(得分:0)
关于Bundler.setup(:default, :test)
没有效果,在我看来,这可能是由Bundler错误导致的,例如this one。
我认为这是一个错误,因为Bundler.setup
并没有被忽略。
考虑以下设置:
# Gemfile
source 'https://rubygems.org'
ruby '2.1.1'
gem 'rack-test', :group => :test
# Rakefile
require 'rake/testtask'
Rake::TestTask.new do |t|
require 'bundler'
Bundler.setup(:default)
t.test_files = FileList['test.rb']
end
# test.rb
require 'bundler'
Bundler.setup(:default)
require 'rack/test'
出乎意料的是,rake test
没有错误地运行。
如果我在Rakefile中注释掉Bundler.setup(:default)
,那么它就不再需要机架/测试了。