我正在编写一个Rake脚本,其中包含带参数的任务。我想出了如何传递参数以及如何使任务依赖于其他任务。
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, :child2_argument2] do |t, args|
# Perform Child2 Task Functionalities
end
答案 0 :(得分:26)
我实际上可以想到在Rake任务之间传递参数的三种方法。
使用Rake对参数的内置支持:
# 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]
通过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]
另一个解决方案是修补Rake的主应用程序对象Rake::Application 并用它来存储任意值:
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
答案 1 :(得分:0)
设置属性似乎也像魅力一样。
确保将任务依赖项设置为设置所需属性的任务。
# 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