Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何找到rake任务的源文件?_Ruby On Rails_Ruby_Rake - Fatal编程技术网

Ruby on rails 如何找到rake任务的源文件?

Ruby on rails 如何找到rake任务的源文件?,ruby-on-rails,ruby,rake,Ruby On Rails,Ruby,Rake,我知道您可以通过键入查看所有可能的rake任务 rake -T 但我需要知道一项任务到底是做什么的。从输出中,我如何才能找到实际具有该任务的源文件?例如,我试图找到db:schema:dump任务的源代码。对于Rails中的大多数rake任务,请查看Rails gem目录中的lib/tasks 如果您已将Rails添加到应用程序目录结构中,请查看vendor/Rails/railties/lib/tasks 无论哪种方式,db:schema:dump都在databases.rake中。不幸的是

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

rake -T

但我需要知道一项任务到底是做什么的。从输出中,我如何才能找到实际具有该任务的源文件?例如,我试图找到db:schema:dump任务的源代码。

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

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


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

不幸的是,没有编程方式来实现这一点。Rake任务可以从rails本身、lib/tasks或任何带有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,只需搜索“
名称空间:schema


实际上,您可能需要
ActiveRecord::SchemaDumper
的源代码,但我认为您应该可以毫不费力地找到它的位置。:-)

不管别人怎么说,您都可以通过编程方式在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)
这将返回为此任务执行的任何代码的源位置。您还可以使用
#先决条件
而不是
#源位置
来获取先决条件任务名称列表(例如“环境”等)

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

Rake.application.tasks

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

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

rake -W
这是在rake 0.9.0中引入的

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


但有没有一种程序化的方法来实现这一点?最后我做了一个在文件中查找的搜索。谢谢你更新这个,很高兴得到一个更新的答案!哇,为什么我之前不知道呢!非常感谢。仅供参考:在使用此方法之前,必须确保已加载rake。如果不是,只需做一个“需要‘耙子’”。非常感谢,好心的先生!好人!你记得你是怎么发现的吗?我被困在rake本身的任务
assets:environment
,多亏了您的解决方案,现在我知道它驻留在
railties-5.0.0.1/lib/rails/application.rb:445
中。
rake-W
是一条死胡同。