2013-03-11 18 views
17

Miałem dość dobrą konfigurację gradacji, która zbudowała wszystko dobrze. Ale jeden z projektów mojej wieloprojektowej kompilacji wywodzi się od reszty z nich tak bardzo, że z chęcią przeniesie go do innego repozytorium git i skonfiguruje submoduły do ​​obsługi.Wielokrotne rzutowanie metodą Gradle "Nie można znaleźć właściwości" źródłoSet "w projekcie" błąd

Najpierw przeniosłem projekt i jego zasoby do podfolderu Libraries/MovedProject. Po zmianie niektórych linii w konfiguracjach graduldzeniowych działało dobrze. Ale wtedy zdecydowałem się napisać nowy build.gradle właśnie dla tego projektu i przenieść wszystkie konfiguracje tam z głównego.

I tu wszystko przestało działać. Kiedy próbuję wywołać dowolne zadanie, zawsze kończy się z Could not find property 'sourceSets' on project ':Libraries/MovedProject'. Linia odpowiedzialna za to:

dependencies { 
    ... 
    if (noEclipseTask) { 
     testCompile project(':Libraries/MovedLibrary').sourceSets.test.output 
    } 
} 

, której używam do prowadzenia testów, w których korzystam z zajęć z innych projektów. Jeśli usuniemy tę linię, kompilacja zakończy się niepowodzeniem tylko wtedy, gdy przejdzie do zadania kompilacjiTestJava projektów wykorzystujących obiekt MovedProject. Jeśli usunąć tę linię i wezwać gradle :Libraries/MovedLibrary:properties widzę:

... 
sourceCompatibility: 1.7 
sourceSets: [source set main, source set test] 
standardOutputCapture: org.gradle.logging.internal.DefaultL[email protected] 
... 

podczas gradle :Libraries/MovedLibrary:build buduje poprawnie.

Obecnie mam wszystko skonfigurować w następujący sposób:

  1. katalogach:

    • /SomeMainProject1
    • /SomeMainProject2
    • /SomeMainProject3
    • /Biblioteki
      • /MovedProject
        • build.gradle
        • dependencies.gradle
        • project.gradle
        • tasks.gradle
    • /Konstruktor
      • dependencies.gradle
      • projekt .gradle
      • tasks.gradle
    • build.gradle
    • settings.gradle
  2. ustawienia.Gradle

    include Libraries/MovedProject, 
         SomeMainProject1, 
         SomeMainProject2, 
         SomeMainProject3 
    
  3. sourceSets dla MovedProject są zdefiniowane w Libraries/MovedProject/project.gradle:

    sourceSets { 
        main { 
         java { 
          srcDir 'src' 
          srcDir 'resources' 
         } 
         resources { srcDir 'resources' } 
        } 
        test { java { 
         srcDir 'test/unit' 
        } } 
    } 
    
  4. zależności, które wykorzystuje sourceSets.test.output są przechowywane w Builder/dependancies.gradle i ustawić dla każdego projektu, który potrzebuje do uruchomienia MovedProject testy:

    project(':SomeMainProject1') { 
        dependencies { 
         ... 
    
         if (noEclipseTask) { 
          testCompile project(':Libraries/net.jsdpu').sourceSets.test.output 
         } 
        } 
    } 
    

Jaki byłby najprostszy sposób na pozbycie się tego błędu i stopniowe tworzenie projektów z bieżącą strukturą katalogów? Chciałbym zrozumieć, dlaczego gradle nie może zobaczyć tej nieruchomości.

Odpowiedz

14

Dana linia jest problematyczna, ponieważ zakłada, że ​​projekt :Libraries/MovedLibrary jest oceniany jako (niewykonany) przed bieżącym projektem, co może nie mieć miejsca. A jeśli tak nie jest, zestawy źródłowe drugiego projektu nie zostały jeszcze skonfigurowane. (Nie będzie nawet właściwości sourceSets, ponieważ wtyczka java-base nie została jeszcze zastosowana.)

Ogólnie rzecz biorąc, najlepiej nie sięgać do modeli projektów innych projektów, zwłaszcza jeśli nie są dziećmi obecny projekt. W przypadku projektu A z użyciem kodu testowego projektu B, zalecane rozwiązanie polega na tym, aby projekt B wystawiał próbny słoik (za pomocą bloku artifacts {}), który jest następnie zużywany przez projekt A.

Jeśli chcesz zachować rzeczy tak jak one możliwe, że możesz rozwiązać ten problem, używając gradle.projectsEvaluated {} lub project.evaluationDependsOn(). Aby uzyskać więcej informacji, patrz Gradle Build Language Reference.

+0

Wielkie dzięki! Teraz wszystko się buduje. Używana własność 'project.evaluationDependsOn()'. Domyślam się, że to rozwiązanie jest brudne, ale muszę go trzymać przez chwilę. –