Почему в Rails-приложениях запускаются спецификации по умолчанию?

У меня есть одно приложение, которое запускает спецификации только с rake, но не знает, где и как определяется эта задача. В lib/tasks нет задач.

Часть Gemfile:

group :test do
  gem 'capybara'
  gem 'guard-rspec'
  gem 'rspec-rails'
  gem 'database_cleaner'
  gem 'launchy'
  gem 'oauth2'
  gem 'rack_session_access'
  gem 'factory_girl'
  gem 'webmock'
  gem 'selenium-webdriver'
end

RSpec gems:

guard-rspec (4.5.0)
rspec (3.1.0)
rspec-core (3.1.7)
rspec-expectations (3.1.2)
rspec-mocks (3.1.3)
rspec-rails (3.1.0)
rspec-support (3.1.2)

Я использую Rake 10.4.2 и Rails 4.1.6.

Кроме того, когда я добавляю:

task :default do
  puts 'No default task.'
end

в Rakefile, сначала он запускает спецификации, а затем печатает "Нет задачи по умолчанию".

EDIT: Добавить Rakefile

# Add your own tasks in files placed in lib/tasks ending in .rake,
# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.

require File.expand_path('../config/application', __FILE__)

Rails.application.load_tasks

Ответ 1

Если у вас есть rspec-rails в Gemfile, тогда, когда жемчуг загружается Rails, он выполнит следующую строку:

https://github.com/rspec/rspec-rails/blob/v3.2.1/lib/rspec-rails.rb#L19

load "rspec/rails/tasks/rspec.rake"

который, в свою очередь, определяет задание по умолчанию:

https://github.com/rspec/rspec-rails/blob/v3.2.1/lib/rspec/rails/tasks/rspec.rake#L6

task :default => :spec

Вот почему задача rake по умолчанию запускает спецификации в вашем приложении Rails.

Кроме того, когда вы добавили этот код:

task :default do
  puts 'No default task.'
end

Это на самом деле не переопределяет задачу по умолчанию: она увеличивает ее. То, как работает определение задачи Rake, добавляет к этой задаче каждое объявление с тем же именем задачи. Он не переопределяет его. Следовательно, результат, который вы видите "Нет задачи по умолчанию" и спецификации, запускается.