2010-02-26 28 views
14

Diyelim ki, bazı dosyaları derlemesi gereken bir hedefim var. Bu hedef, dosyaları alan bir önkoşul olarak başka bir hedefe sahip. en söyleyeyim:Rake görevleri arasında nasıl iletişim kurarsınız?

task :obtain do 
    # obtain files from somewhere 
end 

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

en :obtain hedef her zaman aynı klasöründeki dosyaları yerleştirir olmadığını varsayalım. :compile'u :obtain'un bulduğu yolu nasıl geçirebilirim? Ortam Değişkenleri?

cevap

13

[ 'şey'], bence tercih edilir çünkü bu şekilde yaparsak ($ global veya @instance değişkenlerinin aksine, bunları görev argümanları olarak ele alabilir ve alt görevi komut satırından kolayca kullanabilirsiniz. Diğer yandan, kodunuzu ayrı sınıflar/modüller/yöntemlerde tutuyorsanız, bu tür hacklerle uğraşmanıza bile gerek kalmayacak, kodunuz daha fazla test edilebilir olacaktır. Bunu yapmanın bir yolu için

+0

Evet. İşte böyle bitirdim. Teşekkürler! – Geo

+0

ENV'nin yalnızca anahtarları ve değerleri olarak dizeleri alabildiği unutulmamalıdır, bu yüzden dosya isimleri söz konusu olduğunda bu kısıtlama önemli olmayabilir, diğer çeşit değerler ile uğraşırken iyi bir çözüm olmayabilir. – Dologan

10

bir yolu, genel değişken saklamak olacaktır:

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

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

örnek değişkenler (yani @obtained_dir) de çalışır.

diğer bir yolu, aşağıdaki gibi bir yöntem haline "elde" kod çekmeye olacaktır: ENV kullanma

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. Görev: Edinme, bir görev gibi görünmüyor, sadece diğer insanların aradığı bir yöntem. –

İlgili konular