检查Rakefile中是否存在rake任务

con*_*liv 6 ruby rake rakefile

我正在寻找一种能够检查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
Run Code Online (Sandbox Code Playgroud)

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

Doo*_*oon 12

做这样的事情怎么样?调用任务是否存在,而不是将其作为显式依赖项?

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

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

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

这将有条件地添加对资产的依赖:如果定义了预编译.

  • @Shadwell,仅在需要时不调用,而执行运行它无论如何?在第一个例子中,它应该调用它,如果它还没有被执行,它将执行.如果它已经存在它仍将调用但不执行..如果我需要这个我可能只是后一个例子它更有用/一般,我认为. (2认同)

Sha*_*ell 6

您应该能够使用task_defined?

Rake::Task.task_defined?('assets:precompile')
Run Code Online (Sandbox Code Playgroud)