I have seen examples where a task has parameters and a dependency task like:
task :name, [:first_name, :last_name] => [:pre_name] do |t, args| args.with_defaults(:first_name => "John", :last_name => "Dough") puts "First name is #{args.first_name}" puts "Last name is #{args.last_name}" end
How would you pass parameters to the name task if it was a task dependency like:
task :sendLetter => :name #do something end
You can get a list of Rake tasks available to you, which will often depend on your current directory, by typing rake --tasks . Each task has a description, and should help you find the thing you need.
Including => :environment will tell Rake to load full the application environment, giving the relevant task access to things like classes, helpers, etc. Without the :environment , you won't have access to any of those extras.
Args are passed down through the call stack. You just need to make sure your top-level task captures all the arguments all of the dependencies require. In your case you'll want to put first_name
and last_name
on the send_letter
task.
Here is an example that shows named arguments defined elsewhere flowing into the dependency (even if they aren't defined in the dependency), but the argument that doesn't match the name of the top-level task argument is nil.
desc 'Bar' task :bar, :nom do |task, args| puts "BAR NOM: #{args[:nom]}" puts "BAR NAME: #{args[:name]}" end desc 'Foo' task :foo, [:name] => :bar do |task, args| puts "FOO NAME: #{args[:name]}" end
Running rake foo[baz]
yields
BAR NOM: BAR NAME: baz FOO NAME: baz
It is interesting to note that using args.with_defaults(nom: 'Jaques')
in the foo
task has no effect on the dependent task -- nom
is still nil.
Rake version: rake, version 10.0.3
Ruby version: ruby 1.9.3p125 (2012-02-16 revision 34643) [x86_64-darwin11.3.0]
The closest you're probably going to get is either
task :sendLetter do task(:name).invoke("first", "last") end
or
task :sendLetter do task(:name).execute(["first", "last"]) end
You can do something like
task :sendLetter => task(:name).invoke("first", "last")
but that will invoke name
regardless of whether you ask for sendLetter
or not.
Task#invoke
only calls the task if it hasn't been called and calls any uncalled prereqs first. Task#execute
always calls the task but does not call any prereqs. Note that the parameters don't affect the call-once nature of Task#invoke
: if you invoke a parameterized task twice, it will only get run once, whether or not the parameters are different.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With