Я пишу сценарий Граблей, который состоит из задач с аргументами. Я выяснил, как передать аргументы и как сделать задачу зависящей от других задач.
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
На самом деле я могу придумать три способа передачи аргументов между задачами Rake.
Использовать встроенную в Rake поддержку аргументов:
# принимает аргумент :one и зависит от задачи :second.
task :first, [:one] => :second do |t, args|
puts args.inspect # => '{ :one => "one" }'
end
# аргумент :one был автоматически передан из задачи :first.
task :second, :one do |t, args|
puts args.inspect # => '{ :one => "one" }'
end
$ rake first[one]
Прямой вызов задач через Rake::Task#invoke
:
# принимает аргументы :one, :two и передает их задаче :second.
task :first, :one, :two do |t, args|
puts args.inspect # => '{ :one => "1", :two => "2" }'
task(:second).invoke(args[:one], args[:two])
end
# принимает аргументы :third, :fourth, которые были переданы через #invoke.
# обратите внимание, что аргументы передаются по позиции, а не по имени.
task :second, :third, :fourth do |t, args|
puts args.inspect # => '{ :третий => "1", :четвертый => "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 # => "третий"
Rake.application.my_data = "второй"
end
task :third do
Rake.application.my_data = "третий"
end
$ rake first