Gradle Source Sets

1. Áttekintés

A forráskészletek hatékony módszert kínálnak a forráskód strukturálására a Gradle projektjeinkben.

Ebben a gyors bemutatóban megismerjük, hogyan kell használni őket.

2. Alapértelmezett forráskészletek

Mielőtt az alapértelmezésekbe ugranánk, először magyarázzuk el, hogy melyek a forráskészletek. Ahogy a neve is mutatja, A forráskészletek a forrásfájlok logikai csoportosítását jelentik.

Kitérünk a Java projektek konfigurálására, de a fogalmak más Gradle projekt típusokra is alkalmazhatók.

2.1. Alapértelmezett projekt elrendezés

Kezdjük egy egyszerű projektszerkezettel:

forráskészletek ├── src │ └── main │ ├── java │ │ ├── SourceSetsMain.java │ │ └── SourceSetsObject.java │ └── teszt │ └── SourceSetsTest.java └── build. gradle 

Most vessünk egy pillantást a épít.gradle:

plugin alkalmazása: "java" description = "Forrás beállítása" példa "test {testLogging {események" átment "," kihagyott "," sikertelen "}} függőségek {implementáció ('org.apache.httpkomponensek: httpclient: 4.5.12') testImplementation ('junit: junit: 4.12')}

A Java plugin feltételezi src / main / java és src / test / java alapértelmezett forráskönyvtárakként.

Készítsünk egy egyszerű segédprogramot:

feladat printSourceSetInformation () {doLast {sourceSets.each {srcSet -> println "[" + srcSet.name + "]" print "-> Forrás könyvtárak:" + srcSet.allJava.srcDirs + "\ n" print "-> Output könyvtárak: "+ srcSet.output.classesDirs.files +" \ n "println" "}}}

Csak néhány forráskészlet tulajdonságot nyomtatunk ide. Mindig ellenőrizhetjük a teljes JavaDoc fájlt.

Futtassuk és nézzük meg, mit kapunk:

$ ./gradlew printSourceSetInformation> Feladat: source-sets: printSourceSetInformation [main] -> Forrás könyvtárak: [... / source-sets / src / main / java] -> Kimeneti könyvtárak: [... / source- sets / build / class / java / main] [teszt] -> Forrás könyvtárak: [... / source-sets / src / test / java] -> Kimeneti könyvtárak: [... / source-sets / build / class / java / test] 

Értesítés két alapértelmezett forráskészletünk van: fő- és teszt.

2.2. Alapértelmezett konfigurációk

A Java plugin automatikusan létrehoz néhány alapértelmezett Gradle konfigurációt is.

Különleges elnevezési megállapodást követnek: .

Használjuk őket a függőségek deklarálásához épít.gradle:

függőségek {implementáció ('org.apache.httpcomponents: httpclient: 4.5.12') testImplementation ('junit: junit: 4.12')}

Figyelje meg, hogy megadjuk végrehajtás ahelyett mainImplementation. Ez kivétel a névadási egyezmény alól.

Alapértelmezés szerint, testVégrehajtás a konfiguráció kiterjed végrehajtás és örököl minden függőségét és kimenetét.

Fejlesszük segítő feladatunkat, és nézzük meg, miről van szó:

feladat printSourceSetInformation () {doLast {sourceSets.each {srcSet -> println "[" + srcSet.name + "]" print "-> Forrás könyvtárak:" + srcSet.allJava.srcDirs + "\ n" print "-> Output könyvtárak: "+ srcSet.output.classesDirs.files +" \ n "print" -> Compass classpath: \ n "srcSet.compileClasspath.files.each {print" "+ it.path +" \ n "} println" "} }}

Vessünk egy pillantást a kimenetre:

[main] // ugyanaz a kimenet, mint korábban -> Compile classpath: ... / httpclient-4.5.12.jar ... / httpcore-4.4.13.jar ... / commons-logging-1.2.jar .. ./commons-codec-1.11.jar [teszt] // ugyanaz a kimenet, mint korábban -> Compile classpath: ... / source-sets / build / class / java / main ... / source-sets / build / resources / main ... / httpclient-4.5.12.jar ... / junit-4.12.jar ... / httpcore-4.4.13.jar ... / commons-logging-1.2.jar ... / commons- kodek-1.11.jar ... / hamcrest-core-1.3.jar

A teszt forráskészlet tartalmazza a fő- osztályútvonalában, és a függőségeit is tartalmazza.

Ezután hozzuk létre az egység tesztünket:

public class SourceSetsTest {@Test public void whenRun_ThenSuccess () {SourceSetsObject underTest = new SourceSetsObject ("lorem", "ipsum"); assertThat (underTest.getUser (), is ("lorem")); assertThat (underTest.getPassword (), van ("ipsum")); }}

Itt egy egyszerű POJO-t tesztelünk, amely két értéket tárol. Közvetlenül használhatjuk, mert a fő- kimenetek a mi teszt osztályút.

Ezután futtassuk ezt a Gradle-ból:

./gradlew clean test> Feladat: source-sets: test com.baeldung.test.SourceSetsTest> whenRunThenSuccess PASSED 

3. Egyéni forráskészletek

Eddig észszerű mulasztásokat láttunk. A gyakorlatban azonban gyakran szükségünk van egyedi forráskészletekre, különösen az integrációs tesztekhez.

Ennek oka az lehet, hogy konkrét tesztkönyvtárakat szeretnénk csak az integrációs tesztek osztályterületén tartani. Érdemes ezeket az egységtesztektől függetlenül is végrehajtani.

3.1. Egyéni forráskészletek meghatározása

Készítsünk külön forráskönyvtárat az integrációs tesztjeinkhez:

forráskészletek ├── src │ └── main │ ├── java │ │ ├── SourceSetsMain.java │ │ └── SourceSetsObject.java │ ├── teszt │ │ └── SourceSetsTest.java │ └── itest │ └── SourceSetsITest.java └── build.gradle 

Ezután menjünk konfigurálja a mi épít.gradle használni a sourceSets konstrukció:

sourceSets {itest {java {}}} függőségek {implementáció ('org.apache.httpcomponents: httpclient: 4.5.12') testImplementation ('junit: junit: 4.12')} // egyéb deklarációk kihagyva 

Vegye figyelembe, hogy nem adtunk meg egyedi könyvtárat. Ez azért van, mert a mappánk megegyezik az új forráskészlet nevével (itest).

Tudunk testreszabhatja, milyen könyvtárakat tartalmaz a srcDirs ingatlan:

sourceSets {itest {java {srcDirs ("src / itest")}}}

Emlékszel a segítő feladatunkra a kezdetektől fogva? Futtassuk újra, és nézzük meg, mit nyomtat:

$ ./gradlew printSourceSetInformation> Feladat: source-sets: printSourceSetInformation [itest] -> Forrás könyvtárak: [... / source-sets / src / itest / java] -> Kimeneti könyvtárak: [... / source- sets / build / class / java / itest] -> Classpath fordítása: ... / source-sets / build / class / java / main ... / source-sets / build / resources / main [main] // ugyanaz output, mint korábban [teszt] // ugyanaz, mint korábban

3.2. Forráskészlet-specifikus függőségek hozzárendelése

Emlékszel az alapértelmezett konfigurációkra? Most kaptunk néhány konfigurációt a itest forráskészlet is.

Használjuk itestBevitel új függőség hozzárendeléséhez:

függőségek {implementáció ('org.apache.httpcomponents: httpclient: 4.5.12') testImplementation ('junit: junit: 4.12') itestImplementation ('com.google.guava: guava: 29.0-jre')}

Ez csak az integrációs tesztekre vonatkozik.

Módosítsuk előző tesztünket, és adjuk hozzá integrációs tesztként:

public class SourceSetsItest {@Test public void givenImmutableList_whenRun_ThenSuccess () {SourceSetsObject underTest = new SourceSetsObject ("lorem", "ipsum"); Sorolja fel someStrings = ImmutableList.of ("Baeldung", "is", "klassz"); assertThat (underTest.getUser (), is ("lorem")); assertThat (underTest.getPassword (), van ("ipsum")); assertThat (someStrings.size (), az (3)); }}

Képes hogy futtassa, meg kell definiáljon egy egyéni tesztfeladatot, amely a lefordított kimeneteket használja:

// forráskészlet deklarációk // függőségek deklarációk feladat itest (típus: teszt) {description = "Integrációs tesztek futtatása" group = "ellenőrzés" testClassesDirs = sourceSets.itest.output.classesDirs classpath = sourceSets.itest.runtimeClasspath}

Ezeket a deklarációkat a konfigurációs szakaszban értékelik ki. Ennek eredményeként sorrendjük fontos.

Például nem hivatkozhatunk a itest forrás, amelyet a feladat testben állítottak be, mielőtt ezt deklarálták volna.

Nézzük meg, mi történik, ha lefuttatjuk a tesztet:

$ ./gradlew clean itest // néhány fordítási probléma HIBA: Az összeállítás kivételével sikertelen volt. * Mi rosszul történt: A '' source-sets: compileItestJava 'feladat végrehajtása nem sikerült. > Az összeállítás nem sikerült; a részletekért lásd a fordító hibakimenetét.

Az előző futtatástól eltérően ezúttal fordítási hibát kapunk. Szóval mi történt?

Ez az új forráskészlet független konfigurációt hoz létre.

Más szavakkal, itestBevitel nem örökli a JUnit függőség, és nem is kapja meg annak kimeneteit fő-.

Javítsuk ki ezt a Gradle konfigurációnkban:

sourceSets {itest {compileClasspath + = sourceSets.main.output runtimeClasspath + = sourceSets.main.output java {}}} // függőségek deklarációs konfigurációi {itestImplementation.extendsFrom (testImplementation) itestRuntimeOnly.extendsFrom (testRuntimeOnly)}

Futtassuk újra az integrációs tesztünket:

$ ./gradlew clean itest> Feladat: source-sets: itest com.baeldung.itest.SourceSetsItest> givenImmutableList_whenRun_ThenSuccess PASSED

A teszt sikeres.

3.3. Eclipse IDE kezelése

Eddig láttuk, hogyan kell közvetlenül a Gradle-mel együtt dolgozni a forráskészletekkel. Azonban legtöbbször IDE-t (például Eclipse-t) fogunk használni.

A projekt importálásakor néhány összeállítási kérdést kapunk:

Ha azonban az integrációs tesztet a Gradle-ből futtatjuk, akkor nem kapunk hibát:

$ ./gradlew clean itest> Feladat: source-sets: itest com.baeldung.itest.SourceSetsItest> givenImmutableList_whenRun_ThenSuccess PASSED

Szóval mi történt? Ebben az esetben a gujávafa függőség tartozik itestBevitel.

Sajnálatos módon, az Eclipse Buildship Gradle plugin nem nagyon kezeli ezeket az egyedi konfigurációkat.

Nézzük javítsd ki ezt a mi épít.gradle:

plugin alkalmazása: "eclipse" // korábbi deklarációk eclipse {classpath {plusConfigurations + = [configurations.itestCompileClasspath]}} 

Magyarázzuk el, mit tettünk itt. A konfigurációnkat az Eclipse osztályúthoz csatoltuk.

Ha frissítjük a projektet, akkor az összeállítási kérdések megszűntek.

Azonban, ennek a megközelítésnek van hátránya: Az IDE nem tesz különbséget a konfigurációk között.

Ez azt jelenti, hogy könnyen importálhatunk gujávafa miénkben teszt források (amit kifejezetten el akartunk kerülni).

4. Következtetés

Ebben az oktatóanyagban a Gradle forráskészletek alapjait ismertettük.

Ezután elmagyaráztuk, hogyan működnek az egyéni forráskészletek és hogyan kell használni őket az Eclipse programban.

Szokás szerint a teljes forráskódot megtalálhatjuk a GitHubon.