【问题标题】:How do I find the source file for a rake task?如何找到 rake 任务的源文件?
【发布时间】:2010-10-24 05:52:45
【问题描述】:

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

rake -T

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

【问题讨论】:

    标签: ruby-on-rails ruby rake


    【解决方案1】:

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

    rake -W
    

    这是在 rake 0.9.0 中引入的。

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

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

    【讨论】:

    • 感谢您更新此内容,总是很高兴获得更新的答案!
    • 哇,我怎么不早知道呢!谢谢!
    【解决方案2】:

    不管其他人怎么说,您可以在 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 任务的源位置。

    【讨论】:

    • 仅供参考:在使用此方法之前,您必须确保已加载 rake。如果不是,只需执行“require 'rake'”即可。
    • 非常感谢,好心的先生!
    • 好人!你还记得你是怎么发现的吗?我在任务assets:environment 中被困在 rake 中,感谢您的解决方案,现在我知道它位于railties-5.0.0.1/lib/rails/application.rb:445。 rake -W 是一条死胡同。
    【解决方案3】:

    不幸的是,没有编程方式可以做到这一点。 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 的来源,但我认为您应该可以毫不费力地找出它的来源。 :-)

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

      • 但是有没有一种程序化的方式来做到这一点?我最终在文件搜索中进行了查找。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-24
      • 1970-01-01
      • 2012-04-16
      • 2013-05-12
      • 2023-03-12
      • 1970-01-01
      • 2013-12-25
      相关资源
      最近更新 更多