2010-02-26 14 views
14

Załóżmy, że mam cel, który musi skompilować niektóre pliki. Ten cel ma inny cel jako warunek wstępny, taki, który uzyskuje pliki. Powiedzmy tak:Jak komunikować się między zadaniami Rake?

task :obtain do 
    # obtain files from somewhere 
end 

task :compile => :obtain do 
    # do compilation 
end 

Powiedzmy, że cel :obtain nie zawsze umieszcza pliki w tym samym folderze. Jak mogę przekazać :compile ścieżkę znalezioną przez :obtain? Zmienne środowiska?

Odpowiedz

13

Korzystanie ENV [ „coś”] jest moim zdaniem korzystne, ponieważ jeśli robisz to w ten sposób (w przeciwieństwie do zmiennych $ global lub @instance) możesz traktować je jako argumenty zadania i łatwo używać podrzędnego zadania z linii poleceń.

Z drugiej strony, jeśli zachowasz swój kod w oddzielnych klasach/modułach/metodach, nie będziesz musiał nawet zajmować się tego rodzaju hackami + Twój kod będzie bardziej testowalny.

+0

Tak. Tak właśnie to zrobiłem. Dzięki! – Geo

+0

Należy pamiętać, że ENV może przyjmować łańcuchy jako klucze i wartości, więc chociaż ograniczenie to może nie mieć znaczenia w przypadku nazw plików, może nie być dobrym rozwiązaniem, gdy mamy do czynienia z innymi rodzajami wartości. – Dologan

10

Jednym ze sposobów byłoby przechowywać ją w zmiennej globalnej:

task :obtain do 
    $obtained_dir = "/tmp/obtained" 
end 

task :compile => :obtain do 
    puts "compiling files in #{$obtained_dir}" 
end 

zmienne instancji (tj @obtained_dir) powinny również działać.

Innym sposobem byłoby wyciągnąć „uzyskania” kod do metody, jak następuje:

task :obtain do 
    obtain_files 
end 

task :compile do 
    obtained_dir = obtain_files 
    puts "compiling files in #{obtained_dir}" 
end 

def obtain_files 
    #obtain files from somewhere 
    "/tmp/obtained_files" 
end 
+1

+1 za wykonanie metody put-it-in-a. zadanie: uzyskanie nie wydaje się być w ogóle zadaniem, jest to tylko metoda, którą inni wywołują. –

Powiązane problemy