Как я передаю аргументы от родительской задачи до дочерней задачи в Граблях?

Я пишу сценарий Граблей, который состоит из задач с аргументами. Я выяснил, как передать аргументы и как сделать задачу зависящей от других задач.

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
  • Я могу передать аргументы от родительской задачи до дочерних задач?
  • Существует ли способ сделать дочерние задачи как частные, таким образом, их нельзя назвать независимо?
13
задан Anthony Mastrean 10 October 2012 в 14:01
поделиться

1 ответ

На самом деле я могу придумать три способа передачи аргументов между задачами Rake.

  1. Использовать встроенную в 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]
    
  2. Прямой вызов задач через 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]
    
  3. Другим решением может быть обезьяний патч основного объекта приложения 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
    
26
ответ дан 1 December 2019 в 21:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: