Gradle: общая задача 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
, что нарушает принцип СУХОЙ.
Я думаю, что проблема заключается в том, что фаза конфигурации происходит до того, как настроены подпроекты. Как я могу "отложить" настройку этой задачи, чтобы я только настраивал ext.submissionFiles
в подпроектах?
1 ответ
Я думаю, что вы говорите, что submissionFiles
установлен в build.gradle подпроекта?
Есть несколько способов сделать это.
Вариант 1. Вы можете отложить оценку subproject.ext.submissionFiles
завернув его в замыкание:
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. В некоторых случаях имеет смысл использовать valuationDependsOnChildren (), но я бы вообще не рекомендовал его.