Check if rake task exists from within Rakefile
Asked Answered
I

2

10

I'm looking for a way to be able to check if a certain rake task exists from within the Rakefile. I have a task dependency that I only want to include as a dependency if that task is available. In this particular case, the task is only available in a Rails project, but I want my rake tasks to work in a more general Ruby application environment too (not just Rails).

I want to do something like this:

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

What is the best way to conditionally include a task dependency in a rake task?

Impanation answered 23/4, 2015 at 14:42 Comment(0)
S
15

what about doing something like this? Invoke the task if it exists, as opposed to making it an explicit dependency?

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

or even easier. Since specifying the task again allows you to add to it, something like this appears to work as well.

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

which will conditionally add the dependency on assets:precompile if it is defined.

Showker answered 23/4, 2015 at 15:4 Comment(4)
Chose @Doon's answer because of the more thorough explanation.Impanation
Fair enough. Just be slightly careful with invoke as it doesn't work quite the same as dependencies. It will always run the rake task whereas with a dependency it will only run the rake task if it hasn't already been run.Outofdoors
@Shadwell, Doesn't invoke do only if needed whereas execute runs it regardless? In the first example it should invoke it it, and if it hasn't been executed already, it will execute. If it has been it will still invoke but not execute.. If I needed this I would probably just the latter example it is more useful/general, I think.Showker
@Showker You're absolutely right - I was getting it muddled with execute. invoke does indeed only call it if it hasn't already. Sorry for the confusion. I agree with you in preferring the second solution too.Outofdoors
O
6

You should be able to use task_defined?:

Rake::Task.task_defined?('assets:precompile')
Outofdoors answered 23/4, 2015 at 14:59 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.