'rake spec' 不 运行 与自定义 RAILS_ENV 但 'rspec' 和 'bundle exec rspec' 做
'rake spec' doesn't run with custom RAILS_ENV but 'rspec' and 'bundle exec rspec' do
所以我遇到了一个奇怪的问题。我的 CI 服务器有一个自定义 rails 环境设置,它是 运行ning linux。环境加载正确,测试在 CI 服务器上执行 运行,但前提是我 运行 使用 bundle exec rspec
而不是 bundle exec rake spec
或 bundle exec rake
.
当测试没有 运行 时,它们仍然 return 退出代码 0 并且 CI 服务器假定构建成功,即使理论上构建可能是坏了。
相同的行为发生在我的机器上,即 运行ning OS X.
这是一个包含所有不同测试用例的控制台会话,以更好地说明正在发生的事情。
未指定 RAILS_ENV
~/myapp $ rake
/Users/io/.rvm/rubies/ruby-2.2.0/bin/ruby -I/Users/io/.rvm/gems/ruby-2.2.0/gems/rspec-core-3.3.2/lib:/Users/io/.rvm/gems/ruby-2.2.0/gems/rspec-support-3.3.0/lib /Users/io/.rvm/gems/ruby-2.2.0/gems/rspec-core-3.3.2/exe/rspec --pattern spec/\*\*\{,/\*/\*\*\}/\*_spec.rb
...............................................
Finished in 4.34 seconds (files took 3.1 seconds to load)
47 examples, 0 failures
# -----
~/myapp $ rake spec
/Users/io/.rvm/rubies/ruby-2.2.0/bin/ruby -I/Users/io/.rvm/gems/ruby-2.2.0/gems/rspec-core-3.3.2/lib:/Users/io/.rvm/gems/ruby-2.2.0/gems/rspec-support-3.3.0/lib /Users/io/.rvm/gems/ruby-2.2.0/gems/rspec-core-3.3.2/exe/rspec --pattern spec/\*\*\{,/\*/\*\*\}/\*_spec.rb
...............................................
Finished in 3.8 seconds (files took 3.36 seconds to load)
47 examples, 0 failures
# -----
~/myapp $ rspec
...............................................
Finished in 3.87 seconds (files took 2.98 seconds to load)
47 examples, 0 failures
# -----
~/myapp $ bundle exec rake
/Users/io/.rvm/rubies/ruby-2.2.0/bin/ruby -I/Users/io/.rvm/gems/ruby-2.2.0/gems/rspec-core-3.3.2/lib:/Users/io/.rvm/gems/ruby-2.2.0/gems/rspec-support-3.3.0/lib /Users/io/.rvm/gems/ruby-2.2.0/gems/rspec-core-3.3.2/exe/rspec --pattern spec/\*\*\{,/\*/\*\*\}/\*_spec.rb
...............................................
Finished in 3.9 seconds (files took 3.03 seconds to load)
47 examples, 0 failures
# -----
~/myapp $ bundle exec rake spec
/Users/io/.rvm/rubies/ruby-2.2.0/bin/ruby -I/Users/io/.rvm/gems/ruby-2.2.0/gems/rspec-core-3.3.2/lib:/Users/io/.rvm/gems/ruby-2.2.0/gems/rspec-support-3.3.0/lib /Users/io/.rvm/gems/ruby-2.2.0/gems/rspec-core-3.3.2/exe/rspec --pattern spec/\*\*\{,/\*/\*\*\}/\*_spec.rb
...............................................
Finished in 3.64 seconds (files took 2.97 seconds to load)
47 examples, 0 failures
# -----
~/myapp $ bundle exec rspec
...............................................
Finished in 3.75 seconds (files took 2.95 seconds to load)
47 examples, 0 failures
一切正常
有标准RAILS_ENV
结果与测试、开发或生产相同
~/myapp $ RAILS_ENV=test rake
/Users/io/.rvm/rubies/ruby-2.2.0/bin/ruby -I/Users/io/.rvm/gems/ruby-2.2.0/gems/rspec-core-3.3.2/lib:/Users/io/.rvm/gems/ruby-2.2.0/gems/rspec-support-3.3.0/lib /Users/io/.rvm/gems/ruby-2.2.0/gems/rspec-core-3.3.2/exe/rspec --pattern spec/\*\*\{,/\*/\*\*\}/\*_spec.rb
...............................................
Finished in 3.86 seconds (files took 3.07 seconds to load)
47 examples, 0 failures
# -----
~/myapp $ RAILS_ENV=test rake spec
/Users/io/.rvm/rubies/ruby-2.2.0/bin/ruby -I/Users/io/.rvm/gems/ruby-2.2.0/gems/rspec-core-3.3.2/lib:/Users/io/.rvm/gems/ruby-2.2.0/gems/rspec-support-3.3.0/lib /Users/io/.rvm/gems/ruby-2.2.0/gems/rspec-core-3.3.2/exe/rspec --pattern spec/\*\*\{,/\*/\*\*\}/\*_spec.rb
...............................................
Finished in 3.9 seconds (files took 3.02 seconds to load)
47 examples, 0 failures
# -----
~/myapp $ RAILS_ENV=test rspec
...............................................
Finished in 3.82 seconds (files took 2.98 seconds to load)
47 examples, 0 failures
# -----
~/myapp $ RAILS_ENV=test bundle exec rake
/Users/io/.rvm/rubies/ruby-2.2.0/bin/ruby -I/Users/io/.rvm/gems/ruby-2.2.0/gems/rspec-core-3.3.2/lib:/Users/io/.rvm/gems/ruby-2.2.0/gems/rspec-support-3.3.0/lib /Users/io/.rvm/gems/ruby-2.2.0/gems/rspec-core-3.3.2/exe/rspec --pattern spec/\*\*\{,/\*/\*\*\}/\*_spec.rb
...............................................
Finished in 3.76 seconds (files took 2.91 seconds to load)
47 examples, 0 failures
# ------
~/myapp $ RAILS_ENV=test bundle exec rake spec
/Users/io/.rvm/rubies/ruby-2.2.0/bin/ruby -I/Users/io/.rvm/gems/ruby-2.2.0/gems/rspec-core-3.3.2/lib:/Users/io/.rvm/gems/ruby-2.2.0/gems/rspec-support-3.3.0/lib /Users/io/.rvm/gems/ruby-2.2.0/gems/rspec-core-3.3.2/exe/rspec --pattern spec/\*\*\{,/\*/\*\*\}/\*_spec.rb
...............................................
Finished in 3.83 seconds (files took 2.99 seconds to load)
47 examples, 0 failures
# -----
~/myapp $ RAILS_ENV=test bundle exec rspec
...............................................
Finished in 3.83 seconds (files took 3.11 seconds to load)
47 examples, 0 failures
再一次一切都很好。
自定义 RAILS_ENV
~/myapp $ RAILS_ENV=ci rake
/Users/io/.rvm/rubies/ruby-2.2.0/bin/ruby -I/Users/io/.rvm/gems/ruby-2.2.0/gems/rspec-core-3.3.2/lib:/Users/io/.rvm/gems/ruby-2.2.0/gems/rspec-support-3.3.0/lib /Users/io/.rvm/gems/ruby-2.2.0/gems/rspec-core-3.3.2/exe/rspec --pattern spec/\*\*\{,/\*/\*\*\}/\*_spec.rb
...............................................
Finished in 3.73 seconds (files took 3.03 seconds to load)
47 examples, 0 failures
# -----
~/myapp $ RAILS_ENV=ci rake spec
# No output, just a brief pause and back to shell prompt
~/myapp $ RAILS_ENV=ci rspec
...............................................
Finished in 7.82 seconds (files took 2.96 seconds to load)
47 examples, 0 failures
# -----
~/myapp $ RAILS_ENV=ci bundle exec rake
# No output, just a brief pause and back to shell prompt
~/myapp $ RAILS_ENV=ci bundle exec rake spec
# No output, just a brief pause and back to shell prompt
~/myapp $ RAILS_ENV=ci bundle exec rspec
...............................................
Finished in 7.77 seconds (files took 2.8 seconds to load)
47 examples, 0 failures
由于 CI 服务器设置的性质,我必须 运行 在 bundle exec
中进行测试。但我觉得令人难以置信的是 RAILS_ENV=ci rake
在我的机器上运行完美,而 RAILS_ENV=ci rake spec
却没有 运行.
但是当我将它们包裹在 bundle exec
中时,rake
和 rake spec
运行 在 RAILS_ENV=ci
中都没有,但是 bundle exec rspec
工作正常。
有人能解释一下这是怎么回事吗?我找不到一种方法使它具有任何逻辑意义。我是不是在 Rails' rake 任务中偶然发现了一个错误?
编辑:回应:
你提出了一些非常好的观点,第一点是正确的(它 运行 直接是 rspec 可执行文件),但我不能说你的回答充分解释了正在发生的事情。
此行为并非特定于我的机器,在干净的 ruby:2.2 Docker 容器上的行为是相同的,运行s bundle install before every测试。因为它每次都加载一个干净的容器,"old" 版本的 gem 无法进入。
为了进一步复制 Docker 容器的 "clean slate",我刚刚在我的机器上用一个空的 gem 设置来排除 gem 版本冲突并得到相同的结果:http://pastebin.com/9u3MJaFw
我的 Gemfile 确实没有提到 :ci
组。如果 rspec-rails
gem 没有被加载,那么没有参数的 RAILS_ENV=ci rake
不会 运行 Rspec 作为默认的 Rake 任务,但它显然是.我们还可以看到它有不同的行为,这取决于它是否是 运行 和 bundle exec
。我不相信 运行 bundle exec
会 "unload" rspec-rails
如果 运行 在没有 bundler
的情况下以某种方式设法自动加载它。
如果未加载 rspec
and/or rspec-rails
,rake
将失败,退出代码不是 0
,然后吐出类似:
~/not-myapp $ touch Rakefile
~/not-myapp $ rake 规范
耙子中止!
不知道如何构建任务'spec'
(使用 --trace 查看 运行ning 任务的完整跟踪)
几点:
rspec
rspec
和 bundle exec rspec
总是 运行 你的测试,因为它直接使用 rspec
可执行文件。
耙子
gem rspec-rails
定义了一些 rake 任务,包括 spec
任务。但是,如果 rspec gem 已在使用的环境中加载,rake
将只能 运行 此任务。如果你的 Gemfile 中有这样的东西:
group :test, :development do
gem 'rspec-rails', '~> 3.0'
end
spec
任务命令仅在测试和开发环境中有效,不适用于 RAILS_ENV=ci
。
捆绑包
建议始终使用 bundle exec
到 运行 一个 ruby 可执行文件。来自 Bundler website:
In some cases, running executables without bundle exec
may work, if
the executable happens to be installed in your system and does not
pull in any gems that conflict with your bundle.
However, this is unreliable and is the source of considerable pain.
Even if it looks like it works, it may not work in the future or on
another machine.
如果没有 bundle exec
,可执行文件可能会出现意外或不一致的行为,混合其他 gems 或 gem 已安装在您机器上的版本。
在您的情况下,RAILS_ENV=ci rake
有效而 RAILS_ENV=ci rake spec
无效的事实可能是由于与旧版本的 rspec-spec
或其他一些 gem 定义其他默认 rake 任务。
在任何情况下,此行为都不是错误,可能是您的机器特有的。我建议只使用 bundle exec rspec
到 运行 你的测试。
编辑:回应您的评论:
4 - 即使 rspec-rails
未加载,rake spec
也不会崩溃这一事实是一个棘手的部分。当您尝试 运行 任务 example
时,rake
首先在加载的 rakefile 中搜索任务 example
。如果找不到它,它将检查文件 example
是否存在于您的项目中。如果是,它将尝试从此文件执行任务。
在您的例子中,文件 spec
存在于您的项目中,并且是一个目录。所以当你执行 rake spec
时,如果任务 spec
不存在,它将加载你的 spec
文件,并且在没有任务 运行 之前什么都不做.
这就是 rake blublu
会失败,而 rake spec
或 rake app
不会失败的原因。
所以我遇到了一个奇怪的问题。我的 CI 服务器有一个自定义 rails 环境设置,它是 运行ning linux。环境加载正确,测试在 CI 服务器上执行 运行,但前提是我 运行 使用 bundle exec rspec
而不是 bundle exec rake spec
或 bundle exec rake
.
当测试没有 运行 时,它们仍然 return 退出代码 0 并且 CI 服务器假定构建成功,即使理论上构建可能是坏了。
相同的行为发生在我的机器上,即 运行ning OS X.
这是一个包含所有不同测试用例的控制台会话,以更好地说明正在发生的事情。
未指定 RAILS_ENV
~/myapp $ rake
/Users/io/.rvm/rubies/ruby-2.2.0/bin/ruby -I/Users/io/.rvm/gems/ruby-2.2.0/gems/rspec-core-3.3.2/lib:/Users/io/.rvm/gems/ruby-2.2.0/gems/rspec-support-3.3.0/lib /Users/io/.rvm/gems/ruby-2.2.0/gems/rspec-core-3.3.2/exe/rspec --pattern spec/\*\*\{,/\*/\*\*\}/\*_spec.rb
...............................................
Finished in 4.34 seconds (files took 3.1 seconds to load)
47 examples, 0 failures
# -----
~/myapp $ rake spec
/Users/io/.rvm/rubies/ruby-2.2.0/bin/ruby -I/Users/io/.rvm/gems/ruby-2.2.0/gems/rspec-core-3.3.2/lib:/Users/io/.rvm/gems/ruby-2.2.0/gems/rspec-support-3.3.0/lib /Users/io/.rvm/gems/ruby-2.2.0/gems/rspec-core-3.3.2/exe/rspec --pattern spec/\*\*\{,/\*/\*\*\}/\*_spec.rb
...............................................
Finished in 3.8 seconds (files took 3.36 seconds to load)
47 examples, 0 failures
# -----
~/myapp $ rspec
...............................................
Finished in 3.87 seconds (files took 2.98 seconds to load)
47 examples, 0 failures
# -----
~/myapp $ bundle exec rake
/Users/io/.rvm/rubies/ruby-2.2.0/bin/ruby -I/Users/io/.rvm/gems/ruby-2.2.0/gems/rspec-core-3.3.2/lib:/Users/io/.rvm/gems/ruby-2.2.0/gems/rspec-support-3.3.0/lib /Users/io/.rvm/gems/ruby-2.2.0/gems/rspec-core-3.3.2/exe/rspec --pattern spec/\*\*\{,/\*/\*\*\}/\*_spec.rb
...............................................
Finished in 3.9 seconds (files took 3.03 seconds to load)
47 examples, 0 failures
# -----
~/myapp $ bundle exec rake spec
/Users/io/.rvm/rubies/ruby-2.2.0/bin/ruby -I/Users/io/.rvm/gems/ruby-2.2.0/gems/rspec-core-3.3.2/lib:/Users/io/.rvm/gems/ruby-2.2.0/gems/rspec-support-3.3.0/lib /Users/io/.rvm/gems/ruby-2.2.0/gems/rspec-core-3.3.2/exe/rspec --pattern spec/\*\*\{,/\*/\*\*\}/\*_spec.rb
...............................................
Finished in 3.64 seconds (files took 2.97 seconds to load)
47 examples, 0 failures
# -----
~/myapp $ bundle exec rspec
...............................................
Finished in 3.75 seconds (files took 2.95 seconds to load)
47 examples, 0 failures
一切正常
有标准RAILS_ENV
结果与测试、开发或生产相同~/myapp $ RAILS_ENV=test rake
/Users/io/.rvm/rubies/ruby-2.2.0/bin/ruby -I/Users/io/.rvm/gems/ruby-2.2.0/gems/rspec-core-3.3.2/lib:/Users/io/.rvm/gems/ruby-2.2.0/gems/rspec-support-3.3.0/lib /Users/io/.rvm/gems/ruby-2.2.0/gems/rspec-core-3.3.2/exe/rspec --pattern spec/\*\*\{,/\*/\*\*\}/\*_spec.rb
...............................................
Finished in 3.86 seconds (files took 3.07 seconds to load)
47 examples, 0 failures
# -----
~/myapp $ RAILS_ENV=test rake spec
/Users/io/.rvm/rubies/ruby-2.2.0/bin/ruby -I/Users/io/.rvm/gems/ruby-2.2.0/gems/rspec-core-3.3.2/lib:/Users/io/.rvm/gems/ruby-2.2.0/gems/rspec-support-3.3.0/lib /Users/io/.rvm/gems/ruby-2.2.0/gems/rspec-core-3.3.2/exe/rspec --pattern spec/\*\*\{,/\*/\*\*\}/\*_spec.rb
...............................................
Finished in 3.9 seconds (files took 3.02 seconds to load)
47 examples, 0 failures
# -----
~/myapp $ RAILS_ENV=test rspec
...............................................
Finished in 3.82 seconds (files took 2.98 seconds to load)
47 examples, 0 failures
# -----
~/myapp $ RAILS_ENV=test bundle exec rake
/Users/io/.rvm/rubies/ruby-2.2.0/bin/ruby -I/Users/io/.rvm/gems/ruby-2.2.0/gems/rspec-core-3.3.2/lib:/Users/io/.rvm/gems/ruby-2.2.0/gems/rspec-support-3.3.0/lib /Users/io/.rvm/gems/ruby-2.2.0/gems/rspec-core-3.3.2/exe/rspec --pattern spec/\*\*\{,/\*/\*\*\}/\*_spec.rb
...............................................
Finished in 3.76 seconds (files took 2.91 seconds to load)
47 examples, 0 failures
# ------
~/myapp $ RAILS_ENV=test bundle exec rake spec
/Users/io/.rvm/rubies/ruby-2.2.0/bin/ruby -I/Users/io/.rvm/gems/ruby-2.2.0/gems/rspec-core-3.3.2/lib:/Users/io/.rvm/gems/ruby-2.2.0/gems/rspec-support-3.3.0/lib /Users/io/.rvm/gems/ruby-2.2.0/gems/rspec-core-3.3.2/exe/rspec --pattern spec/\*\*\{,/\*/\*\*\}/\*_spec.rb
...............................................
Finished in 3.83 seconds (files took 2.99 seconds to load)
47 examples, 0 failures
# -----
~/myapp $ RAILS_ENV=test bundle exec rspec
...............................................
Finished in 3.83 seconds (files took 3.11 seconds to load)
47 examples, 0 failures
再一次一切都很好。
自定义 RAILS_ENV
~/myapp $ RAILS_ENV=ci rake
/Users/io/.rvm/rubies/ruby-2.2.0/bin/ruby -I/Users/io/.rvm/gems/ruby-2.2.0/gems/rspec-core-3.3.2/lib:/Users/io/.rvm/gems/ruby-2.2.0/gems/rspec-support-3.3.0/lib /Users/io/.rvm/gems/ruby-2.2.0/gems/rspec-core-3.3.2/exe/rspec --pattern spec/\*\*\{,/\*/\*\*\}/\*_spec.rb
...............................................
Finished in 3.73 seconds (files took 3.03 seconds to load)
47 examples, 0 failures
# -----
~/myapp $ RAILS_ENV=ci rake spec
# No output, just a brief pause and back to shell prompt
~/myapp $ RAILS_ENV=ci rspec
...............................................
Finished in 7.82 seconds (files took 2.96 seconds to load)
47 examples, 0 failures
# -----
~/myapp $ RAILS_ENV=ci bundle exec rake
# No output, just a brief pause and back to shell prompt
~/myapp $ RAILS_ENV=ci bundle exec rake spec
# No output, just a brief pause and back to shell prompt
~/myapp $ RAILS_ENV=ci bundle exec rspec
...............................................
Finished in 7.77 seconds (files took 2.8 seconds to load)
47 examples, 0 failures
由于 CI 服务器设置的性质,我必须 运行 在 bundle exec
中进行测试。但我觉得令人难以置信的是 RAILS_ENV=ci rake
在我的机器上运行完美,而 RAILS_ENV=ci rake spec
却没有 运行.
但是当我将它们包裹在 bundle exec
中时,rake
和 rake spec
运行 在 RAILS_ENV=ci
中都没有,但是 bundle exec rspec
工作正常。
有人能解释一下这是怎么回事吗?我找不到一种方法使它具有任何逻辑意义。我是不是在 Rails' rake 任务中偶然发现了一个错误?
编辑:回应
此行为并非特定于我的机器,在干净的 ruby:2.2 Docker 容器上的行为是相同的,运行s bundle install before every测试。因为它每次都加载一个干净的容器,"old" 版本的 gem 无法进入。
为了进一步复制 Docker 容器的 "clean slate",我刚刚在我的机器上用一个空的 gem 设置来排除 gem 版本冲突并得到相同的结果:http://pastebin.com/9u3MJaFw
我的 Gemfile 确实没有提到
:ci
组。如果rspec-rails
gem 没有被加载,那么没有参数的RAILS_ENV=ci rake
不会 运行 Rspec 作为默认的 Rake 任务,但它显然是.我们还可以看到它有不同的行为,这取决于它是否是 运行 和bundle exec
。我不相信 运行bundle exec
会 "unload"rspec-rails
如果 运行 在没有bundler
的情况下以某种方式设法自动加载它。如果未加载
rspec
and/orrspec-rails
,rake
将失败,退出代码不是0
,然后吐出类似:~/not-myapp $ touch Rakefile
~/not-myapp $ rake 规范
耙子中止!
不知道如何构建任务'spec'
(使用 --trace 查看 运行ning 任务的完整跟踪)
几点:
rspec
rspec
和 bundle exec rspec
总是 运行 你的测试,因为它直接使用 rspec
可执行文件。
耙子
gem rspec-rails
定义了一些 rake 任务,包括 spec
任务。但是,如果 rspec gem 已在使用的环境中加载,rake
将只能 运行 此任务。如果你的 Gemfile 中有这样的东西:
group :test, :development do
gem 'rspec-rails', '~> 3.0'
end
spec
任务命令仅在测试和开发环境中有效,不适用于 RAILS_ENV=ci
。
捆绑包
建议始终使用 bundle exec
到 运行 一个 ruby 可执行文件。来自 Bundler website:
In some cases, running executables without
bundle exec
may work, if the executable happens to be installed in your system and does not pull in any gems that conflict with your bundle.However, this is unreliable and is the source of considerable pain. Even if it looks like it works, it may not work in the future or on another machine.
如果没有 bundle exec
,可执行文件可能会出现意外或不一致的行为,混合其他 gems 或 gem 已安装在您机器上的版本。
在您的情况下,RAILS_ENV=ci rake
有效而 RAILS_ENV=ci rake spec
无效的事实可能是由于与旧版本的 rspec-spec
或其他一些 gem 定义其他默认 rake 任务。
在任何情况下,此行为都不是错误,可能是您的机器特有的。我建议只使用 bundle exec rspec
到 运行 你的测试。
编辑:回应您的评论:
4 - 即使 rspec-rails
未加载,rake spec
也不会崩溃这一事实是一个棘手的部分。当您尝试 运行 任务 example
时,rake
首先在加载的 rakefile 中搜索任务 example
。如果找不到它,它将检查文件 example
是否存在于您的项目中。如果是,它将尝试从此文件执行任务。
在您的例子中,文件 spec
存在于您的项目中,并且是一个目录。所以当你执行 rake spec
时,如果任务 spec
不存在,它将加载你的 spec
文件,并且在没有任务 运行 之前什么都不做.
这就是 rake blublu
会失败,而 rake spec
或 rake app
不会失败的原因。