52

我知道您可以通过键入查看所有可能的 rake 任务

rake -T

但我需要知道一个任务到底是做什么的。从输出中,我怎样才能找到实际具有任务的源文件?例如,我正在尝试查找 db:schema:dump 任务的来源。

4

4 回答 4

90

我知道这是一个老问题,但无论如何:

rake -W

这是在 rake 0.9.0 中引入的。

http://rake.rubyforge.org/doc/release_notes/rake-0_9_0_rdoc.html

支持 -where (-W) 标志,用于显示任务的定义位置。

于 2013-04-27T21:41:43.007 回答
49

不管其他人怎么说,您可以通过编程方式在 rails 应用程序中获取 rake 任务的源位置。为此,只需在您的代码中或从控制台运行类似以下内容:

# load all the tasks associated with the rails app
Rails.application.load_tasks

# get the source locations of actions called by a task
task_name = 'db:schema:load' # fully scoped task name
Rake.application[task_name].actions.map(&:source_location)

这将返回为此任务执行的任何代码的源位置。您还可以使用#prerequisites而不是#source_location获取先决条件任务名称的列表(例如“环境”等)。

您还可以使用以下命令列出所有加载的任务:

Rake.application.tasks

更新:请参阅下面的 Magne 的好答案。对于rake >= 0.9.0的版本,您可以使用它rake -W来显示 rake 任务的源位置。

于 2012-04-12T18:50:24.120 回答
6

不幸的是,没有编程方法可以做到这一点。Rake 任务可以从 rails 本身、lib/tasks 或任何带有任务目录的插件加载。

这应该包括 Rails 本身以外的大部分内容:

find . -name "*.rake" | xargs grep "whatever"

至于db:schema:dump,这里是来源:

desc "Create a db/schema.rb file that can be portably used against any DB supported by AR"
task :dump => :environment do
  require 'active_record/schema_dumper'
  File.open(ENV['SCHEMA'] || "#{RAILS_ROOT}/db/schema.rb", "w") do |file|
    ActiveRecord::SchemaDumper.dump(ActiveRecord::Base.connection, file)
  end
end

它可以在 rails 2.2.2 gem 的 lib/tasks/database.rake 的第 242 行找到。如果您有不同版本的 Rails,只需搜索“ namespace :schema”。

您可能实际上想要 的来源ActiveRecord::SchemaDumper,但我认为您应该毫不费力地找出它的来源。:-)

于 2009-05-06T17:58:28.760 回答
0

对于 Rails 中的大多数 rake 任务,请在 lib/tasks 中的 Rails gem 目录中查看。

如果您已将 Rails 供应到您的应用程序目录结构中,请查看 vendor/rails/railties/lib/tasks

无论哪种方式,db:schema:dump 都在 databases.rake 中。

于 2009-05-06T16:37:54.430 回答