Gradle: чтение блока переменных из подпроекта в root задании проекта - PullRequest
0 голосов
/ 07 апреля 2020

Я изучал, как определить блок переменных в небольшом количестве подпроектов build.gradle.kts, и прочитать эти блоки из задачи, определенной в root проекте build.gradle.kts.

SubProject1 build.gradle.kts

dependencies {
    "implementation"("dependency.one:dep-one-api")
    ...
}

additionalProjectSpecificVars {
    val additionalOptions = listOf<String>("option1", "option2", ...)
    val additionalLocations = listOf<String>("$projectDir/location1/...", "$projectDir/location2/...")
}

Root Проект build.gradle.kts

subprojects {
    if (project.name.endsWith("-wsdl")) {
        apply(plugin = "no.nils.wsdl2java")

        dependencies {
            ...
        }

        tasks.withType<no.nils.wsdl2java.Wsdl2JavaTask> {
            generatedWsdlDir = file("$projectDir/generatedsources")
            wsdlDir = file("$projectDir/wsdl")
            wsdlsToGenerate = gatherWsdlFiles()
        }
    }
}

fun Project.gatherWsdlFiles() : List<ArrayList<String>> {

    // 2-D Array
    var wsdlsToGenerateList = listOf<ArrayList<String>>()

    // Gather all the files in the WSDL directory
    val wsdlCollection = layout.files({
        file("$projectDir/wsdl").listFiles()
    })

    // Filter out only the .wsdl files
    val wsdlOnlyFiles: FileCollection = wsdlCollection.filter { file: File ->
        file.name.endsWith(".wsdl")
    }

    // Iterate the files collection and add the cxf-parameters
    wsdlOnlyFiles.forEach { wsdl: File ->

        val wsdlArray = listOf<String>(
                "-xjc-Xnamespace-prefix",
                "-xjc-XhashCode",
                "-xjc-Xequals",
                "-xjc-XtoString",
                wsdl.name)

        wsdlsToGenerateList.plus(wsdlArray)
    }


    // Read and add the other options from the subprojects 
    // additionalProjectSpecificVars block here and add to
    // wsdlsToGenerateList list


    return wsdlsToGenerateList
}

Я экспериментировал с project.ext, project.extra, gradle.ext et c, но похоже, это если вы хотите прочитать свойство, заданное в rootProject, а не наоборот.

Gradle v.6.2.2

1 Ответ

0 голосов
/ 09 апреля 2020

Хорошо, поэтому я решил это, используя свойства extra[], но только во время определенной фазы c.

В моем root build.gradle.kts я обновил выше if заявление, чтобы добавить свойства после шага оценки проекта. Если бы я не включил их на этом этапе, их не было. Затем я передал три значения в качестве параметров моей функции gatherWsdlFiles().

subprojects {
    if (project.name.endsWith("-wsdl")) {
        apply {
            plugin("no.nils.wsdl2java")
        }

        dependencies {
            ...

            "wsdl2java"("...")
        }

        wsdl2javaExt {
            deleteGeneratedSourcesOnClean = true
        }

        tasks.withType<no.nils.wsdl2java.Wsdl2JavaTask> {

            afterEvaluate {
                val wsdlLocations = extra["wsdlLocations"] as List<String>
                val wsdlBindings = extra["wsdlBindings"] as List<String>
                val wsdlAdditionalOptions = extra["wsdlAdditionalOptions"] as List<String>

                generatedWsdlDir = file("$projectDir/generatedsources")
                wsdlDir = file("$projectDir/wsdl")
                wsdlsToGenerate = gatherWsdlFiles(wsdlLocations, wsdlBindings, wsdlAdditionalOptions)
            }

            tasks.named("compileJava") {
                dependsOn("wsdl2java")
                sourceSets {
                    main {
                        java {
                            srcDirs(listOf("generatedsources"))
                        }
                    }
                }
            }
        }
    }
}

В каждом из моих подпроектов -wsdl я добавил три свойства extra в файлы build.gradle.kts, каждый с соответствующими значениями для этого проекта. Если значения не требуются, я просто инициализирую пустой список. (Использование emptyList() не удалось с Not enough information to infer type variable T)

extra["wsdlLocations"] = listOf("$projectDir/wsdl/wsdl_1.wsdl")
extra["wsdlBindings"] = mutableListOf<String>()
extra["wsdlAdditionalOptions"] = listOf(
        "-p",
        "http://www.csapi.org/wsdl/blah.service",
        "-p",
        "http://www.csapi.org/wsdl/blah._interface")

dependencies {
    "implementation"("dependency.one:dep-one-api")
}
...