2011-04-20 20 views
19

widziałem przykłady, gdzie zadanie ma parametry i zadania zależnościach jak:Jak zadeklarować zadanie Rake, które zależy od sparametryzowanego zadania?

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 

Jak można przekazać parametry do nazwa zadania, jeśli to była zależność zadanie jak:

task :sendLetter => :name 
    #do something 
end 

Odpowiedz

21

Args są przekazywane przez stos wywołań. Trzeba tylko upewnić się, że zadanie na najwyższym poziomie przechwytuje wszystkie argumenty wymagane przez wszystkie zależności. W twoim przypadku będziesz chciał umieścić first_name i last_name w zadaniu send_letter.

Oto przykład, który pokazuje nazwane argumenty zdefiniowane gdzie indziej wpływające do zależności (nawet jeśli nie są zdefiniowane w zależności), ale argument, który nie pasuje do nazwy argumentu zadania najwyższego poziomu, jest zerowy .

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] yeilds

BAR NOM: 
BAR NAME: baz 
FOO NAME: baz 

Ciekawostką jest, aby pamiętać, że stosując args.with_defaults(nom: 'Jaques') w zadaniu foo nie ma wpływu na zadania zależnej - nom nadal jest zerowa.

wersja Rake: rake, version 10.0.3

wersja Ruby: ruby 1.9.3p125 (2012-02-16 revision 34643) [x86_64-darwin11.3.0]

+1

Dziękuję bardzo pomocne. Ale, Boże, mam nadzieję, że zmienne metakintaktyczne umrą i powrócą dobre twórcze przykłady. –

7

Najbliższe, co prawdopodobnie otrzymasz, to:

task :sendLetter do 
    task(:name).invoke("first", "last") 
end 

lub

task :sendLetter do 
    task(:name).execute(["first", "last"]) 
end 

Można zrobić coś jak

task :sendLetter => task(:name).invoke("first", "last") 

ale że będzie wywoływał name niezależnie od tego, czy poprosić o sendLetter czy nie.

Task#invoke wywołuje zadanie tylko wtedy, gdy nie zostało wywołane i najpierw wywołuje wszelkie nieuzasadnione żądania wstępne. Task#execute zawsze wywołuje zadanie, ale nie wywołuje żadnych wymagań wstępnych. Zauważ, że parametry nie mają wpływu na charakter jednorazowy Task#invoke: jeśli wywołasz sparametryzowane zadanie dwa razy, zostanie ono uruchomione tylko raz, niezależnie od tego, czy parametry są różne.

Powiązane problemy