【问题标题】:Check if rake task exists from within Rakefile检查 Rakefile 中是否存在 rake 任务
【发布时间】:2015-04-23 14:42:55
【问题描述】:

我正在寻找一种方法来检查 Rakefile 中是否存在某个 rake 任务。我有一个任务依赖项,如果该任务可用,我只想将其作为依赖项包含在内。在这种特殊情况下,该任务仅在 Rails 项目中可用,但我希望我的 rake 任务也可以在更通用的 Ruby 应用程序环境中工作(不仅仅是 Rails)。

我想做这样的事情:

if tasks.includes?('assets:precompile')
  task :archive => [:clean, :vendor_deps, 'assets:precompile']
    ...
  end
else
  task :archive => [:clean, :vendor_deps]
    ...
  end
end

在 rake 任务中有条件地包含任务依赖项的最佳方法是什么?

【问题讨论】:

    标签: ruby rake rakefile


    【解决方案1】:

    做这样的事情怎么样?如果任务存在则调用它,而不是使其成为显式依赖项?

     task :archive => [:clean, :vendor_deps] do 
      Rake.application["assets:precompile"].invoke if Rake::Task.task_defined?('assets:precompile')
       .... 
      end
    

    甚至更容易。由于再次指定任务允许您添加到它,这样的事情似乎也可以工作。

    task :archive => [:clean, :vendor_deps] do
        ...
      end
    task :archive => "assets:precompile" if  Rake::Task.task_defined?("assets:precompile")
    

    这将有条件地添加对 assets:precompile 的依赖(如果已定义)。

    【讨论】:

    • 选择@Doon 的答案是因为解释更详尽。
    • 很公平。请注意invoke,因为它与依赖项的工作方式不同。它将始终运行 rake 任务,而具有依赖关系时,它只会在尚未运行的情况下运行 rake 任务。
    • @Shadwell,只有在需要时才调用 do 而 execute 无论如何都会运行它?在第一个示例中,它应该调用它,如果尚未执行,它将执行。如果是这样,它仍然会调用但不执行。如果我需要这个,我可能只是后一个例子,它更有用/更通用,我认为。
    • @Doon 你说的完全正确——我把它和execute 搞混了。 invoke 确实只在尚未调用它的情况下才调用它。对困惑感到抱歉。我也同意你更喜欢第二种解决方案。
    【解决方案2】:

    你应该可以使用task_defined?:

    Rake::Task.task_defined?('assets:precompile')
    

    【讨论】:

      猜你喜欢
      • 2018-04-18
      • 2021-05-26
      • 2012-07-30
      • 2017-04-14
      • 1970-01-01
      • 1970-01-01
      • 2011-02-11
      • 1970-01-01
      • 2022-11-25
      相关资源
      最近更新 更多