`捆绑exec rake`或`rake`?那么`Rake :: TestTask`怎么样?

时间:2014-05-06 05:43:51

标签: ruby testing rake bundler rake-task

致电bundle exec rakebundle 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。

2 个答案:

答案 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),那么它就不再需要机架/测试了。