2015-02-08 3 views
0

У меня есть многопроектная градиентная сборка, в которой все подпроекты корневого проекта имеют общую задачу zip. Они должны заархивировать некоторый источник, в зависимости от настроек подпроекта.Gradle: общая задача Zip для каждого подпроекта

Во-первых, я настроил его родителей build.gradle:

subprojects { subproject -> 
    apply plugin: 'java' 
    ... 

    task submission(type: Zip) { 
     destinationDir = subproject.buildDir 
     archiveName = subproject.name 

     from subproject.ext.submissionFiles 
    } 
} 

Но это не работает с Cannot get property 'submissionFiles' on extra properties extension as it does not exist. Поэтому я переместил задачу в каждом подпроекте build.gradle, что нарушает принцип DRY.

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

+0

Созданы ли «файлы представления» другой задачей? – bigguy

ответ

3

Я думаю, вы говорите, что submissionFiles установлен в build.gradle подпроекта?

Есть несколько способов сделать это.

Вариант 1. Вы можете отложить оценку subproject.ext.submissionFiles обернув его в closure:

task submission(type: Zip) { 
    destinationDir = subproject.buildDir 
    archiveName = subproject.name 

    from ({ subproject.ext.submissionFiles }) 
} 

Вариант 2. Я думаю, что это могло бы быть лучше, если вы не использовали промежуточную переменную (submissionFiles) и непосредственно настроил задачу представления в детях:

// In root 
task submission(type: Zip) { 
    destinationDir = subproject.buildDir 
    archiveName = subproject.name 
} 

// In child 
submission { 
    from("path/to/files") 
} 

Используя промежуточную переменную, как, что для перемещения конфигурации а раунд может сделать ваши сборки сложнее понять связи между задачами.


Вариант 3. В некоторых случаях имеет смысл использовать evaluationDependsOnChildren(), но я бы вообще не рекомендовал его.

+0

Мне нравится второй вариант! – madhead

+0

Проблема в первом примере '' 'from ({subproject.ext.submissionFiles})' '' работает, но я не могу заставить '' '' destinationDir = subproject.buildDir''' работать. Сообщение об ошибке: '' 'Не удалось получить неизвестное свойство 'buildDir' для проекта ': sub-project-name'. Несомненно, должно быть, чтобы написать это в корневых проектах, чтобы переменные были введены в цикле конфигурации? – Wrench

Смежные вопросы