2013-04-19 17 views
10

Ürünümüz için temel geliştirme alanı kuracak bir platform inşa dosyası yazıyorum. Esasen tüm gerçek kodlar özel eklentiler ve özel görevlerde olacak. İlgili adımların birçoğu oldukça tekrarlı (çoklu sudo çağrıları, çoklu kullanıcı eklemeleri) ve ortak şeyleri bir göreve dahil etmek istiyorum. ÖrneğinOrtak komut satırı işlemleri için Exec görevini yeniden kullanmanın en uygun yolu nedir?

:

task('addDBUser', type:AddUser) { 
    username = joeUser 
} 

task('startService', type:SudoExec) { 
    workingDir = "not/too/relevant" 
    commandLine = "/etc/init.d/coolService start" 
} 
Ben klişe temin ederken, Exec olarak tidily mümkün olduğunca (stdin, stdout vs.) beni alır çeşitli işlevleri yeniden kullanmak istediğiniz

("sudo ... ") otomatik olarak. Eminim, sadece DefaultTask yerine Exec'yi genişletebileceğime eminim, fakat gerçek eylemi tetiklemek için standart bir yol bilmiyorum. CommandLine özelliğini gereksinim duyduğum şeyle değiştirmek kolay görünüyor, ancak Exec’nin gerçekten gitmek istediğimde kullanacağım jenerik "run()" veya benzeri bir şey yok.

Hangi yöntemin çalışma yöntemi olduğunu belirlemek ve daha sonra doğrudan çağırmak için Exec'yi açarım mı? Ya da hedefimi gerçekleştirmenin daha genel bir yolu var mı?

+1

Reddetme nedeni nedir? Yanlış olanı bilmiyorum daha iyi sorular yazamam. –

+0

Josh'a katılıyorum. Ayrıca birisinin hiçbir sebep göstermeden aşağıya vermesinden nefret ediyorum. Düşündüğüm için yorum gerekecekse en iyisi olacağını düşünüyorum. – pepuch

cevap

10

Bir görev için hangi yöntemin yürütüldüğünü görmek için Exec kaynaklarını kontrol edebilir ve @TaskAction ile işaretlenmiş bir yöntemi arayabilirsiniz. Bu, exec() yönteminin olduğu ortaya çıkıyor, ancak genel olarak görevleri el ile çağırmak istemiyorsunuz ancak Gradle'ın sizin için yapmasına izin veriyorsunuz. Fikrimdeki en iyi fikir, özel görevlerinize yöntem/belirteç eklemektir. Bu böyle görünebilir:

task addUser(type: AddUser) { 
    username = 'fromGradle' 
} 


class SudoExec extends Exec { 

    void sudoCommand(Object... arguments) { 
     executable 'sudo' 
     args = arguments.toList() 
    } 
} 

class AddUser extends SudoExec { 

    void setUsername(String username) { 
     sudoCommand('useradd', username) 
    } 
} 
+0

Ah ve bu yöntemin ve @TaskAction ek açıklamasının her ikisi de miras alınacağından, Exec komutunun hangi yöntemi kullandığını bilmem gerekmiyor. Beklenen değerleri değiştirdiğimde, Gradle benim için noktaları birleştirir. Bu soruyu yazdığımda, OO'yu tıkladığım için göremediğim nispeten basit bir şey olacağını hissettim. (Boston metropol bölgesinde uzun bir hafta oldu.) Sabırlı olduğunuz için teşekkürler! –

+0

Sizin için noktaları birleştiren 'Exec' ve Gradle' ın içsellerini bilmek zorunda değilsiniz. Sorun değil ve iyi şanslar! – erdi

+0

Bu kötü bir çözümdür çünkü kapsüllemeyi bozar. Genel olarak, kullanıcılarınızın bu görevin sadece temel bir Exec görevi ve hatta daha fazlası olduğunu bilmelerini istemezsiniz - bunların, mirasa maruz kalan, çalıştırılabilir veya hatalar gibi parametrelerini karıştırmasını istemezsiniz. – dant3

1

Bu kod herhangi bir spesifik parametrelerin belirleyiciler içine kanca olmadığı için, birden çok parametre kontrol altında tutabilir, ama tembel gstring değerlendirmesini kullanır.

task vagrantfile (type:Vagrantfile) { 
    account 'vagrant' 
    password 'vagrant' 
} 

class Vagrantfile extends Copy { 
    String account 
    String password 

    def Vagrantfile() { 
     from 'templates/' 
     into 'build/' 
     include 'Vagrantfile.ubuntu.tpl' 
     rename {'Vagrantfile'} 
     expand (account:"${->account}", password:"${->password}") 
    } 
} 
İlgili konular