rake任务在哪里定义?

rya*_*ogo 66 ruby rake ruby-on-rails rakefile

在新创建的Rails项目(由...生成rails someName)上,可以运行一些"默认"rake任务,例如:

  • rake test
  • rake db:migrate
  • 等等

问题是,这些任务在哪里被描述?默认情况下Rakefile没有所有这些任务.

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

小智 106

如果描述你的意思是定义,耙子-W是你的朋友.例:

$ rake -W db:create
Run Code Online (Sandbox Code Playgroud)

=>

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)>'
Run Code Online (Sandbox Code Playgroud)

刚刚发现今天:)

  • 教人钓鱼的好例子. (9认同)
  • 整洁,没有记录在我能找到的任何Rake手册页中. (3认同)

Dan*_*nne 49

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

当我们谈论任务db:migrate时,它位于rails gem中 lib/tasks/databases.rake

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

  • 至少在Rails 4中,数据库任务存储在ActiveRecord gem中.要查看Rake从中加载任务的路径,请使用`rake -W task:name` (4认同)

jpg*_*eek 19

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

启动rails控制台:

rails c
Run Code Online (Sandbox Code Playgroud)

然后运行以下命令:

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
Run Code Online (Sandbox Code Playgroud)

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

从同行评论,对于rake v 10.1.0以及可能的旧版rake,您可能需要调用:tsk.actions而不是tsk.locations

  • 小提示:您不应该每个都需要。`Rake.application.tasks.find`。此外,如果它对您来说是私人的,您可能需要发送负载。`Rake.application.send(:load, 'Rakefile')` 或者你可以直接使用 `Rake.application.load_rakefile`。 (2认同)
  • @con--谢谢。相应更新。 (2认同)

mra*_*ruz 5

您没有指定您正在使用哪个版本的rails,但在3.0.7中,db任务位于ActiveRecord gem中

lib/active_record/railties/databases.rake
Run Code Online (Sandbox Code Playgroud)

更新:

从rails 3.2.7开始,任务仍然是我在上面所说的.