Gradle - копирование зависимостей подпроектов в соответствующую папку подпроектов - PullRequest
0 голосов
/ 12 ноября 2018

Из корня я в основном пытаюсь получить зависимости каждого подпроекта и скопировать в каталог с именем зависимость внутри каждого подпроекта

У меня есть корневой проект, и в этом файле build.gradle у меня есть задача, подобная приведенной ниже:

task copyDependencies(type:Copy) {

    nonTestProjects.each {
        delete rootProject.project(it).file('dependencies')
        from rootProject.project(it).configurations.runtime
        intorootProject.project(it).file('dependencies/')
    }
}

Внутри Sub. Projects build.gradle у меня есть зависимости, как показано ниже:

 dependencies
 {
    implementation "com.google.protobuf:protobuf-java:$protobufVersion"
    implementation "io.netty:netty:$nettyVersion"
    implementation "xmlpull:xmlpull:$xmlPullVersion"
}

При запуске зависимостей копирования задачи от пользователя root появляется сообщение об ошибке, как показано ниже:

Не удалось получить неизвестное свойство 'runtime' для контейнера конфигурации типа org.gradle.api.internal.artifacts.configurations.DefaultConfig urationContainer.

1 Ответ

0 голосов
/ 12 ноября 2018

Вы получаете ошибку Could not get unknown property 'runtime' for configuration container, потому что, когда gradle конфигурирует ваш корневой проект и пытается создать задачу copyDependencies, подпроекты еще не были оценены, поэтому Gradle не знает о конфигурации "во время выполнения" на данном этапе ( java плагин еще не был применен к подпроектам).

Таким образом, одним из решений было бы заключить это создание задачи в gradle.projectsEvaluated ловушку жизненного цикла:

gradle.projectsEvaluated {
    task copyDependencies(type:Copy) {
        // task definition ...
    }
}

Но тогда у вас возникнут другие проблемы, потому что вы хотите скопировать разные источники в разные каталоги назначения (см. Как копировать в несколько мест назначения с помощью задачи копирования Gradle? для возможного решения этой проблемы)

Я думаю, что лучшим способом было бы создать различные copyDependencies задачи, по одной на подпроект, и создать задачу «агрегатора» в корневом проекте, которая будет зависеть от задач этих подпроектов:

// aggregator task at root project level
task copyDependencies

// create copydependencies task for each (non-test) subproject
gradle.projectsEvaluated {
    nonTestProjects.each {
        Project proj = project(it)
        Task task = proj.task('copyDependencies', type: Copy) {
            from proj.configurations.runtimeClasspath
            into proj.file("dependencies")
            doFirst {
                file('dependencies').deleteDir()
            }
        }
        copyDependencies.dependsOn task
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...