I am writing a Rake script which consists of tasks with arguments. I figured out how to pass arguments and how to make a task dependent on other tasks.
task :parent, [:parent_argument1, :parent_argument2, :parent_argument3] => [:child1, :child2] do
# Perform Parent Task Functionalities
end
task :child1, [:child1_argument1, :child1_argument2] do |t, args|
# Perform Child1 Task Functionalities
end
task :child2, [:child2_argument1, :c开发者_如何学运维hild2_argument2] do |t, args|
# Perform Child2 Task Functionalities
end
- Can I pass the arguments from the parent task to the child tasks?
- Is there a way to make the child tasks as private so they can't be called independently?
I can actually think of three ways for passing arguments between Rake tasks.
Use Rake’s built-in support for arguments:
# accepts argument :one and depends on the :second task. task :first, [:one] => :second do |t, args| puts args.inspect # => '{ :one => "one" }' end # argument :one was automagically passed from task :first. task :second, :one do |t, args| puts args.inspect # => '{ :one => "one" }' end $ rake first[one]
Directly invoke tasks via
Rake::Task#invoke
:# accepts arguments :one, :two and passes them to the :second task. task :first, :one, :two do |t, args| puts args.inspect # => '{ :one => "1", :two => "2" }' task(:second).invoke(args[:one], args[:two]) end # accepts arguments :third, :fourth which got passed via #invoke. # notice that arguments are passed by position rather than name. task :second, :third, :fourth do |t, args| puts args.inspect # => '{ :third => "1", :fourth => "2" }' end $ rake first[1, 2]
Another solution would be to monkey patch Rake’s main application object Rake::Application
and use it to store arbitary values:class Rake::Application attr_accessor :my_data end task :first => :second do puts Rake.application.my_data # => "second" end task :second => :third do puts Rake.application.my_data # => "third" Rake.application.my_data = "second" end task :third do Rake.application.my_data = "third" end $ rake first
Setting attributes seems to work like a charm too.
Just ensure the the task dependency is set to the task that sets the attributes you need.
# set the attribute I want to use in another task
task :buy_puppy, [:name] do |_, args|
name = args[:name] || 'Rover'
@dog = Dog.new(name)
end
# task I actually want to run
task :walk_dog => :buy_puppy do
@dog.walk
end
精彩评论