在哪里定义了 rake 任务?

在新创建的 Rails 项目(由 rails someName生成)中,可以运行一些“默认”rake 任务,比如:

  • rake test
  • rake db:migrate
  • 等等

问题是,这些任务在哪里被描述? 默认的 Rakefile没有所有这些任务。

此外,我检查了一些使用 rspec的项目,我能够运行 rake spec来运行所有的测试。spec目标定义在哪里?

24356 次浏览

Rake 任务是从文件夹结构 lib/tasks/*.rake中自动加载的

例如,当我们讨论任务 db: shift 时,它位于 lib/tasks/databases.rake中的 Railsgem 中

因此,对于特定的项目,您将始终拥有项目文件夹结构中的任务以及指定 gem 中的所有任务。

您没有指定所使用的 Rails 的版本,但是在3.0.7中,db任务位于

lib/active_record/railties/databases.rake

更新:

至于 Rails 版本3.2.7,任务仍然在我上面说过的地方。

在 Rails 3中,railties gem 定义了许多 rake 任务。

railties-3.2.5/lib/rails/tasks/annotations.rake
railties-3.2.5/lib/rails/tasks/documentation.rake
railties-3.2.5/lib/rails/tasks/engine.rake
railties-3.2.5/lib/rails/tasks/framework.rake
railties-3.2.5/lib/rails/tasks/log.rake
railties-3.2.5/lib/rails/tasks/middleware.rake
railties-3.2.5/lib/rails/tasks/misc.rake
railties-3.2.5/lib/rails/tasks/routes.rake
railties-3.2.5/lib/rails/tasks/statistics.rake
railties-3.2.5/lib/rails/tasks/tmp.rake
railties-3.2.5/lib/rails/test_unit/testing.rake

如果你的 $EDITOR已经配置好了,你可以很容易地用 open_gem gem 来看到它们:

gem install open_gem
gem open railties

要查找定义和/或修改任务的特定文件和行号,请执行以下操作:

启动一个 Rails 控制台:

rails c

然后运行以下命令:

require 'rake'
Rake::TaskManager.record_task_metadata=true
Rake.application.load_rakefile
tsk = Rake.application.tasks.find {|t| t.name =='my_task_name'}
tsk.locations

Rake 基本上可以跟踪内部的位置,并有一个漂亮的方法来显示它们的请求。上面的代码基本上加载 Rake,告诉 Rake 跟踪文件位置,加载 Rakefile (以及所有其他包含的文件) ,找到有问题的任务,并在其上调用 location 方法。

在 sameers 的评论中,对于 rake v 10.1.0和可能更老版本的 rake,您可能必须调用: 行动 而不是 Tsk.location

如果你的意思是定义,rake-W 是你的朋友。例如:

$ rake -W db:create

=>

rake db:create  /path/to/ruby/gems/1.9.1/gems/activerecord-3.1.11/lib/active_record/railties/databases.rake:39:in `block in <top (required)>'

今天刚发现的:)

您签出的项目可能使用了 Rspec-Rail gem。这个 gem 定义了 spec任务。您可以在这里看到它的源代码:

Https://github.com/rspec/rspec-rails/blob/master/lib/rspec/rails/tasks/rspec.rake

列出所有任务:

rake -P

由于许多任务来自您安装的 gem,所以很难知道哪些任务是添加的..。