2013-03-07 27 views
11

Mam kompilację Gradle, która generuje główny artefakt dostarczalny (instalator) mojego produktu. Projekt Gradle, który modeluje to ma wiele różnych zależności w różnych konfiguracjach. Wiele z tych zależności znajduje się w domyślnej konfiguracji modułów zewnętrznych, a niektóre z tych modułów mają konfigurację testResults zawierającą (zipowane) wyniki zadania testowego.Obsługa brakującej konfiguracji w zależności w budowie Gradle

Ważne jest, aby wyniki testów dla wszystkich zależności, o ile istnieją, zostały opublikowane jako artefakty w głównej kompilacji produktu (w celu wykorzystania jako dowód, że testy miały miejsce i zakończyły się powodzeniem). To nie jest problem, jeśli nie istnieją.

Próbowałem zrobić to poprzez iterację wszystkich konfiguracji kompilacji produktu, iterację po zależnościach w każdym i dodanie programowo utworzonej zależności (w nowej konfiguracji stworzonej do tego celu) na konfiguracji testResults modułu.

Innymi słowy, tworzę zależności tak:

def processDependencyForTests(Dependency dependency) { 

    def testResultsDependency = [ 
     'group' : dependency.group, 
     'name' : dependency.name, 
     'version' : dependency.version, 
     'configuration' : 'testResults' 
     ] 

    project.dependencies.add 'allTestResults', testResultsDependency 

ta zapełnia że konfiguracja dobrze, ale oczywiście, gdy próbuję zrobić nic z nim, to nie pierwszy raz spotykam się zależność od moduł, który w rzeczywistości nie mieć danej testResults konfiguracji:

def resolvedConfiguration = configurations.allTestResults.resolvedConfiguration 

wyniki w tym:

Build file 'C:\myproduct\build.gradle' line: 353 

* What went wrong: 
Execution failed for task ':myproduct:createBuildRecord'. 
> Could not resolve all dependencies for configuration ':myproduct:allTestResults'. 
    > Module version group:mygroup, module:myproduct, version:1.2.3.4, configuration:allTestResults declares a dependency on configuration 'testResults' which is not declared in the module descriptor for group:mygroup, module:mymodule, version:1.0 

To nie jest praktyczne, aby zamiast tego jawnie wymieniać zależności w sposób deklaratywny, ponieważ chcę, aby były wyprowadzane z "zależności od tego, jakie projekty produktu mają".

Jak mogę się upewnić, że takie oczekiwane brakujące konfiguracje nie powodują utraty mojej kompilacji? Pomyślałem, że odpowiedź na to pytanie może być związana z łagodnymi konfiguracjami, ale nie zaszedłem aż tak daleko (najpierw muszę uzyskać ResolvedConfiguration, o ile wiem). Alternatywnie, jeśli sposób w jaki robię to jest szalony, co jest bardziej naturalnym idiomem Gradle, aby to osiągnąć?

+0

Czy kiedykolwiek znaleźć rozwiązanie do obsługi brakujących konfiguracje? – knuton

Odpowiedz

1

Przed znalezieniem referencji należy sprawdzić, czy konfiguracja istnieje. W takich przypadkach, gradle DSL documentation jest twoim przyjacielem. W rzeczywistości projekt gradle jest jednym z najlepiej udokumentowanych projektów open source, z którymi kiedykolwiek pracowałem.

Tutaj znajdziesz, że configurations jest po prostu pojemnikiem z obiektami configuration. Są to instancje odpowiednio ConfigurationContainer i Configuration. Wiedząc o tym, wystarczy sprawdzić, czy pojemnik configurations zawiera configuration o nazwie "testResults".

ten może zostać osiągnięty za pomocą następującego kodu:

if (configurations.find { it.name == 'testResults' }) { 
    // do your stuff 
} 
+0

Pytanie dotyczy konfiguracji w deskryptorach modułów artefaktów. – knuton

0

Wydaje sugerował, że Dependency przypadki przekazywane do metody processDependencyForTests są Moduł Zależności w multi-modułów zbudować.

W takim przypadku można przesłać je do usługi ProjectDependency, która ma właściwość dependencyProject, która umożliwia uzyskanie dostępu do obiektu Project tej zależności.Stamtąd możesz użyć depProject.configurations.findByName, aby sprawdzić, czy konfiguracja istnieje.

Coś wzdłuż linii:

def processDependencyForTests(Dependency dependency) { 
    if(dependency instanceof ProjectDependency) { 
    ProjectDependency projDep = (ProjectDependency) dependency 
    if(projDep.dependencyProject.configurations.findByName('testResults')) { 
     def testResultsDependency = [ 
     'group' : dependency.group, 
     'name' : dependency.name, 
     'version' : dependency.version, 
     'configuration' : 'testResults' 
     ] 
     project.dependencies.add 'allTestResults', testResultsDependency 
    } 
    } 

HTH

Powiązane problemy