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 (), но я бы вообще не рекомендовал его.

Другие вопросы по тегам