2015-01-27 2 views
0

У меня есть очень простой Мультипроект построить, как показано ниже:Gradle: Задача не выполняет другую задачу на основе конфигурации он использует

Module1, который генерирует банку публичного API и выставляет его через "publicAPI "конфигурация:

configurations { 
    publicAPI 
} 

task generatePublicAPI(type: Jar) { 
    outputs.upToDateWhen { false } 
    baseName 'public-api' 
    from sourceSets.main.output 
} 

artifacts { 
    publicAPI generatePublicAPI 
} 

module2, который использует API банку общественной (путем ссылки конфигурации 'publicAPI' определен в Module1) для создания приложений банки:

configurations { 
    generateApplication 
} 

dependencies { 
    generateApplication project(path: ':module1', configuration: 'publicAPI') 
} 

task jarApp(type: Jar) { 
    baseName 'app' 
    from configurations.generateApplication.collect { 
     it.isDirectory() ? it : zipTree(it) 
    } 
} 

Теперь, когда я исполню «Gradle: module2: jarApp» задачу, я получил следующую ошибку:

Не удается развернуть ZIP «/ дома/PICASSO/Документы/GradlePlayground/module1/строить/LIBS/Государственно-api.jar» , как не существует

и я могу видеть, что Gradle был не пытается выполнить„generatePublicAPI“ Мо dule1.

Однако, если я "jarApp" задача зависит от "generatePublicAPI" задачи в явном виде,

task jarApp(dependsOn: 'module1:generatePublicAPI', type: Jar) {...} 

тогда все в порядке.

BUT, не будет ли этот подход против одной из целей использования конфигурации зависимостей, так что мне не нужно беспокоиться о деталях построения модуля 1, например. какая задача генерирует банку и какие артефакты она производит?

Я думал, что gradle может решить задачи, которые необходимо выполнить, следуя «маршруту» ссылочной конфигурации зависимостей.

Я пропустил что-то здесь, так что задача «generatePublicAPI» может быть выполнена автоматически, без необходимости явно объявлять «dependsOn» для задачи «createApp»?

+0

В основном, насколько я вижу 'module2' зависит от' module1'. Может быть, добавление 'evaluationDependsOn (': module1')' в build.gradle для 'module2' поможет? И это не тот случай, когда град всегда может разрешать зависимости между проектами/модулями. Иногда ему нужна помощь;). Вот почему методы определены. – Opal

+0

Спасибо за указатель! Однако добавление «оценкиDependsOn (': modules1')» не работает. У меня такое же сообщение об ошибке. –

+0

Является ли проект размещенным в Интернете? Github? – Opal

ответ

1

Я задал тот же вопрос на форуме Gradleware и получил ответ от одного из основных разработчиков, вот link.

В основном проблема заключается в том, что метод collect возвращает новую коллекцию, но gradle не знает, что эта новая коллекция была сгенерирована из конфигурации, поэтому она не могла определить, какую задачу выполнить.

Решение состоит в том, вместо того, чтобы объявить зависимость от задачи, объявить зависимость от фактической конфигурации вместо того, чтобы иметь следующий вид:

task jarApp(dependsOn: configurations.generateApplication, type: Jar)