Как отфильтровать подмодули в Gradle, чтобы применить соответствующий плагин? - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть многомодульный проект, некоторые из которых являются библиотеками Java, а другие - библиотеками Android.Я хотел применить пользовательские плагины для своих подпроектов (модулей) в зависимости от типа проекта, поэтому я сделал что-то вроде этого (см. Фрагмент кода) в файле build.gradle корня моего проекта.Эта настройка работает, но мне интересно, есть ли другой способ сделать это.Gradle предлагает Фильтрация по свойствам , но я получаю ошибку Cannot add task 'integTest' as a task with that name already exists, если я попробую это.integTest - это задача, которую я создал в файлах customJavaBuild.gradle и customAndroidBuild.gradle.Любая помощь приветствуется.Спасибо!

def javaLibraries = ["projA", "projB"]
def androidLibraries = ["projC"]

subprojects {
    if (javaLibraries.contains(it.name)) {
        apply from: '$rootDir/gradle/customJavaBuild.gradle'
    } else if (androidLibraries.contains(it.name)) {
        apply from: '$rootDir/gradle/customAndroidBuild.gradle'
    } else {
        //Apply custom plugin for some other project type.
    }
} 

Фильтрация по свойствам

subprojects {
    project.ext {
        projectType = null
    }

    project.afterEvaluate {
        if (project.ext.projectType == 'jar') {
            apply from: '$rootDir/gradle/customJavaBuild.gradle'
        } else if (project.ext.projectType == 'aar') {
            apply from: '$rootDir/gradle/customAndroidBuild.gradle'
        } else {
            //Apply custom plugin for some other project type.
        }
    }
}

И у меня есть это дополнительное свойство ext.projectType = 'jar' в моих подмодулях '(projA, projB, projC) build.gradle файлов.

1 Ответ

0 голосов
/ 06 февраля 2019

Проблема в том, что в вашем project.afterEvaluate блоке вы применяете свой пользовательский скрипт gradle к root project, а не к оцененному sub project, что приводит к ошибке с уже определенной задачей integTest.

Вам следует переписать свой блок project.afterEvaluate примерно следующим образом:

subprojects {
    project.ext {
        projectType = null
    }

    project.afterEvaluate {
        if (project.ext.projectType == 'jar') {
            // WARNING : use "project.apply ..." instead of "apply ..." here
            project.apply from : "$rootDir/gradle/customJavaBuild.gradle"
        } else if (project.ext.projectType == 'aar') {
            project.apply from : "$rootDir/gradle/customAndroidBuild.gradle"
        } else {
            // nothing
        }
    }

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...