2017-05-26 8 views
0

Ich habe eine grundlegende Abfrage über die Gradle-Lebenszyklus. Mein Projekt ist ein Multi-Modul-Projekt.Chaining Gradle Aufgaben und Gradle Lebenszyklus

bemerkte ich, dass die folgenden Befehl ein:

./gradlew clean bignibou-server:run 

die folgenden zwei Befehle in dieser Reihenfolge zu laufen laufen nicht entspricht:

./gradlew clean 

./gradlew bignibou-server:run 

bignibou-server einer meiner Module ist.

Die Ausgabe des ersten Befehls führt zu einer anderen Ausgabe als die beiden folgenden Befehle.

Kann jemand bitte erklären, warum das möglicherweise auf relevante Dokumentation verweist?

bearbeiten: Im ersten Fall wird einer der erzeugten Quellen gelöscht, während er im zweiten Fall nicht gelöscht wird. Wie kann das sein?

bearbeiten 2:

von der Wurzel build.gradle:

import io.franzbecker.gradle.lombok.task.DelombokTask 

def javaVersion = 1.8 

buildscript { 

    repositories { 
     mavenCentral() 
     maven { url "http://repo.spring.io/release" } 
     maven { url "http://repo.spring.io/milestone" } 
     maven { url "http://repo.spring.io/snapshot" } 
     maven { url "https://plugins.gradle.org/m2/" } 
    } 

    ext { 
     javaLanguageLevel = '1.8' 
    } 

    ext['mockito.version'] = "${mockitoVersion}" 
    ext['hibernate.version'] = "${hibernateVersion}" 

    dependencies { 
     classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") 
     classpath("io.franzbecker:gradle-lombok:${gradleLombokVersion}") 
    } 
} 

configure(allprojects) { project -> 
    group = "com.bignibou" 

    apply plugin: 'java' 
    apply plugin: 'eclipse' 
    apply plugin: 'idea' 

    configurations { 
     mapstruct 
    } 

    repositories { 
     mavenCentral() 
     maven { url "http://repo.spring.io/release" } 
     maven { url "http://repo.spring.io/milestone" } 
     maven { url "http://repo.spring.io/snapshot" } 
     maven { url "https://artifacts.elastic.co/maven" } 
    } 

    compileJava { 
     sourceCompatibility = javaVersion 
     targetCompatibility = javaVersion 
    } 

    test { 
     reports.html.destination = file("$reports.html.destination/unit") 
     reports.junitXml.destination = file("$reports.junitXml.destination/unit") 
    } 

    task delombok(type: DelombokTask) { 
     ext.outputDir = file("$buildDir/src-delomboked/java") 
     outputs.dir(outputDir) 
     sourceSets.main.java.srcDirs.each { 
      inputs.dir(it) 
      args(it, "-d", outputDir) 
     } 
    } 

    // FIXME: refactor paths to generated sources 
    task mapStructClean { 
     delete file("build/generated-sources/mapstruct/main") 
    } 

    task generateMainMapperClasses(type: JavaCompile, group: 'build') { 
     ext.aptDumpDir = file("${buildDir}/tmp/apt/mapstruct") 
     destinationDir = aptDumpDir 

     classpath = compileJava.classpath + configurations.mapstruct 
     source = file("$buildDir/src-delomboked/java") 
     ext.sourceDestDir = file("build/generated-sources/mapstruct/main") 

     options.define(
       compilerArgs: [ 
         "-nowarn", 
         "-proc:only", 
         "-encoding", "UTF-8", 
         "-processor", "org.mapstruct.ap.MappingProcessor" + ',lombok.launch.AnnotationProcessorHider$AnnotationProcessor', 
         "-s", sourceDestDir.absolutePath, 
         "-source", rootProject.javaLanguageLevel, 
         "-target", rootProject.javaLanguageLevel, 
       ] 
     ); 

     inputs.dir source 
     outputs.dir "${buildDir}/generated-sources/mapstruct/main" 
     doFirst { 
      sourceDestDir.mkdirs() 
     } 
     doLast { 
      aptDumpDir.delete() 
     } 
    } 
} 

task wrapper(type: Wrapper) { gradleVersion = '3.5' } 

von bignibou-commmon Modul:

description = "Bignibou Common" 

apply plugin: 'org.springframework.boot' 
apply plugin: 'io.franzbecker.gradle-lombok' 

configurations { 
    querydslapt 
    mapstruct 
} 


dependencyManagement { 
    dependencies { 
     dependency "org.elasticsearch:elasticsearch:${elasticsearchVersion}" 
    } 
} 

dependencies { 

    compile("org.springframework.boot:spring-boot-starter-data-jpa") { 
     exclude group: 'org.apache.tomcat', module: 'tomcat-jdbc' 
    } 
    compile("org.springframework.boot:spring-boot-starter-mail") 
    compile('org.springframework.security:spring-security-core') 
    compile('org.hibernate:hibernate-validator') 
    compile("org.hibernate:hibernate-java8") 
    compile("com.fasterxml.jackson.datatype:jackson-datatype-jsr310") 

    //Spring cloud 
    compile("org.springframework.cloud:spring-cloud-spring-service-connector") 
    compile("org.springframework.cloud:spring-cloud-localconfig-connector") 
    compile("org.springframework.cloud:spring-cloud-cloudfoundry-connector") 

    // Relational Database 
    compile("org.postgresql:postgresql:${postgresqlVersion}") 
    compile("org.flywaydb:flyway-core") 

    // Connection pooling 
    compile("com.zaxxer:HikariCP") 

    //Shield 
    compile("org.elasticsearch.client:x-pack-transport:${elasticsearchVersion}") 
    compile("org.elasticsearch:elasticsearch:${elasticsearchVersion}") 
    compile("org.apache.logging.log4j:log4j-api") 
    compile("org.apache.logging.log4j:log4j-core") 

    // QueryDSL 
    compile("com.querydsl:querydsl-core:${queryDslVersion}") 
    compile("com.querydsl:querydsl-jpa:${queryDslVersion}") 
    querydslapt("com.querydsl:querydsl-apt:${queryDslVersion}") 

    // Jackson 
    compile("com.fasterxml.jackson.core:jackson-core") 
    compile("com.fasterxml.jackson.core:jackson-annotations") 

    compile("org.mapstruct:mapstruct-jdk8:${mapstructVersion}") 
    mapstruct("org.mapstruct:mapstruct-processor:${mapstructVersion}") 
    compile("org.apache.httpcomponents:httpclient:${httpClientVersion}") 

    compile("org.jasypt:jasypt:${jasyptVersion}") 

} 

sourceSets { 

    main { 
     ext.originalJavaSrcDirs = java.srcDirs 
     java.srcDir "build/generated-sources/mapstruct/main" 
     output.dir("build/generated-mail-templates") 
    } 

    generated { 
     java { 
      srcDirs = ["build/generated-sources/java", "build/src-delomboked/java", "build/generated-sources/mapstruct/main"] 
     } 
    } 
} 

bootRepackage { 
    enabled = false 
} 

task generateQueryDSL(type: JavaCompile, group: 'build') { 
    description "Generates the QueryDSL query types" 
    source = sourceSets.main.java 
    classpath = configurations.compile + configurations.querydslapt 
    options.compilerArgs = [ 
      "-proc:only", 
      "-processor", 
      "com.querydsl.apt.jpa.JPAAnnotationProcessor" + ',lombok.launch.AnnotationProcessorHider$AnnotationProcessor' 
    ] 
    destinationDir = sourceSets.generated.java.srcDirs.iterator().next() 
} 

// FIXME: add cssFile & 
// FIXME: add dependsOn processMailTemplates & 
// FIXME: clean mail templates html 
// FIXME: ensure build is stopped if templates are not processed 

task npmInstall(type: Exec) { 
    description "npm install" 
    commandLine 'npm', 'install' 
} 

task processMailTemplates { 
    description "Processes mail templates" 
    dependsOn npmInstall 

    def templateSrcDir = "src/main/templates/mail/" 
    def templateDestDir = "build/generated-mail-templates/META-INF/templates/mail/" 

    mkdir templateDestDir 

    def templateNames = [] 

    fileTree(dir: templateSrcDir, include: '**/*.html').visit { 
     FileVisitDetails details -> templateNames << details.file.name 
    } 

    templateNames.each { templateName -> inlineCss(templateSrcDir + templateName, templateDestDir + templateName) } 

    outputs.upToDateWhen { false } 
} 

static def inlineCss(src, dest) { 
    def juice = 'node_modules/.bin/juice' 
    def juiceResourcesDir = 'src/main/templates/misc/' 
    def juiceArgs = "--options-file ${juiceResourcesDir}juiceOptions.json --css ${juiceResourcesDir}mailStyle.css" 
    "${juice} ${juiceArgs} ${src} ${dest}".execute(null, new File('bignibou-common')) 
} 


compileJava { 
    dependsOn generateQueryDSL 
    source generateQueryDSL.destinationDir 
} 

compileGeneratedJava { 
    dependsOn generateQueryDSL 
    options.warnings = false 
    classpath += sourceSets.main.runtimeClasspath 
} 

idea { 
    module { 
     sourceDirs += file('build/generated-sources/java') 
    } 
} 

processResources.dependsOn processMailTemplates 
compileJava.dependsOn generateMainMapperClasses 
generateMainMapperClasses.dependsOn mapStructClean 
generateMainMapperClasses.dependsOn delombok 


clean { 
    delete sourceSets.generated.java.srcDirs 
} 

von bignibou-server Modul:

description = "Bignibou Server" 

configurations { 
    mapstruct 
    integrationTest 
    integrationTestCompile.extendsFrom testCompile 
    integrationTestRuntime.extendsFrom testRuntime 
} 

apply plugin: 'io.franzbecker.gradle-lombok' 
apply plugin: 'org.springframework.boot' 
apply plugin: 'application' 


dependencyManagement { 
    dependencies { 
     dependency "org.elasticsearch:elasticsearch:${elasticsearchVersion}" 
    } 
} 

dependencies { 
    compile project(":bignibou-common") 
    compile project(":bignibou-client") 

    //Spring boot 
    compile("org.springframework.boot:spring-boot-starter-actuator") 
    compile("org.springframework.boot:spring-boot-starter-data-jpa") { 
     exclude group: 'org.apache.tomcat', module: 'tomcat-jdbc' 
    } 
    compile("org.springframework.boot:spring-boot-starter-data-redis") { 
     exclude group: 'redis.clients', module: 'jedis' 
    } 
    compile("biz.paluch.redis:lettuce:${lettuceVersion}") 
    compile("org.springframework.boot:spring-boot-starter-web") 
    compile("org.springframework.boot:spring-boot-starter-security") 
    compile("org.springframework.boot:spring-boot-starter-thymeleaf") 
    compile("org.springframework.boot:spring-boot-starter-cache") 

    // Miscellaneous 
    compile("commons-collections:commons-collections") 
    compile("org.apache.commons:commons-lang3:${commonLangVersion}") 
    mapstruct("org.mapstruct:mapstruct-processor:${mapstructVersion}") 

    //Caching 
    compile("org.hibernate:hibernate-ehcache") 
    compile("com.github.ben-manes.caffeine:caffeine:${caffeineVersion}") 

    // Spring Session 
    compile("org.springframework.session:spring-session") 

    // Testing 
    testCompile project(":bignibou-test") 
} 

run { 
    systemProperty "spring.cloud.propertiesFile", System.getProperty("user.dir") + "/spring-cloud.properties" 
} 

springBoot { 
    mainClassName = "com.bignibou.Application" 
} 

sourceSets { 

    main { 
     ext.originalJavaSrcDirs = java.srcDirs 
     java.srcDir "build/generated-sources/mapstruct/main" 
    } 

    generated { 
     java { 
      srcDirs = ["build/src-delomboked/java", "build/generated-sources/mapstruct/main"] 
     } 
    } 

    integrationTest { 
     java.srcDirs = ['src/it/java'] 
     resources.srcDirs = ['src/it/resources', 'src/main/resources'] 
     compileClasspath = sourceSets.main.output + configurations.testRuntime 
     runtimeClasspath = output + compileClasspath 
    } 
} 

task integrationTest(type: Test) { 
    description "Run the integration tests." 
    testClassesDir = sourceSets.integrationTest.output.classesDir 
    classpath = sourceSets.integrationTest.runtimeClasspath 
    reports.html.destination = file("$reports.html.destination/integration") 
    reports.junitXml.destination = file("$reports.junitXml.destination/integration") 
} 

compileJava.dependsOn generateMainMapperClasses 
generateMainMapperClasses.dependsOn mapStructClean 
generateMainMapperClasses.dependsOn delombok 

check.dependsOn integrationTest 
integrationTest.shouldRunAfter test 

bearbeiten 3: Der Ordner, der von dem ersten Befehl in und nicht die zweiten gelöscht wird ist die folgende (von bignibou-common Modul):

build/generated-mail-templates 

bearbeitet 4: Ich habe bemerkt, dass nach der Kommentierung out output.dir(... Aufruf (siehe unten), wird die build/generated-mail-templates nicht gelöscht, aber leider sind die Vorlagen sind nicht im classpath enthalten ...

sourceSets { 
     main { 
     ext.originalJavaSrcDirs = java.srcDirs 
     java.srcDir "build/generated-sources/mapstruct/main" 
     //output.dir("build/generated-mail-templates") 
     } 
+0

Könnte einfacher zu erklären, wenn Sie den Code des Builds, und die Ausgabe, die Sie in den beiden Fällen erhalten. –

+0

@JBNizet Ich habe meinen Beitrag mit einer ersten Bearbeitung bearbeitet. Ich werde Teile des Build-Skripts in eine zweite Bearbeitung einfügen. – balteo

+0

@JBNizet Ich habe meinen Beitrag entsprechend bearbeitet. – balteo

Antwort

2
task processMailTemplates { 
    description "Processes mail templates" 
    dependsOn npmInstall 

    def templateSrcDir = "src/main/templates/mail/" 
    def templateDestDir = "build/generated-mail-templates/META-INF/templates/mail/" 

    mkdir templateDestDir 

    def templateNames = [] 

    fileTree(dir: templateSrcDir, include: '**/*.html').visit { 
     FileVisitDetails details -> templateNames << details.file.name 
    } 

    templateNames.each { templateName -> inlineCss(templateSrcDir + templateName, templateDestDir + templateName) } 

    outputs.upToDateWhen { false } 
} 

All dieser Code wird während der Konfigurationsphase ausgeführt, unabhängig von der Aufgabe, die Sie ausführen möchten. Es sollte stattdessen während der Ausführungsphase ausgeführt werden:

+0

Danke. Mir war der Unterschied zwischen Konfigurations- und Ausführungsphase nicht bewusst. Ich habe meine Aufgabendefinition wie empfohlen geändert, aber die Diskrepanz der oben beschriebenen Verhaltensweisen bleibt bestehen. Haben Sie eine andere Idee, warum das? Warum würde – balteo

+0

nicht wirklich. Ich stelle fest, dass Sie in mapStructClean denselben Fehler machen, aber ich denke nicht, dass dies der Grund für Ihr Problem ist. –