Подтвердить что ты не робот

Выполнение задачи gradle для подпроектов

У меня есть проект MultiModule gradle, который я пытаюсь настроить.

Root
    projA
    projB
    other
        projC
        projD
        projE
        ...

Хотелось бы, чтобы у меня была возможность выполнить задачу в корневой сборке build.gradle, которая выполнит задачу buildJar в каждом из проектов в другом каталоге.

Я знаю, что могу сделать

configure(subprojects.findAll {it.name != 'tropicalFish'}) {
    task hello << { task -> println "$task.project.name"}
}

Но это также получит projA и projB, я хочу только запустить задачу на c, d, e... Пожалуйста, дайте мне знать, как наилучшим образом достичь этого.

4b9b3361

Ответ 1

Не совсем уверен, какой из них вам нужен, но они должны покрывать ваши базы.

1. Вызов задач напрямую

Вы можете просто позвонить

gradle :other/projC:hello :other/projD:hello

Я тестировал это с помощью:

# Root/build.gradle
allprojects {
    task hello << { task -> println "$task.project.name" }
}

и

# Root/settings.gradle
include 'projA'
include 'projB'
include 'other/projC'
include 'other/projD'

2. Только создание задач в подпроектах

Или вам нужна только задача, созданная на других проектах /*?

Если последнее, то работает следующее:

# Root/build.gradle
allprojects {
    if (project.name.startsWith("other/")) {
        task hello << { task -> println "$task.project.name" }
    }
}

и его можно вызвать с помощью:

$ gradle hello
:other/projC:hello
other/projC
:other/projD:hello
other/projD

3. Создание задачи, выполняющей задачи только в подпроектах

Эта версия соответствует моему чтению вашего вопроса, означающего, что уже есть задача в подпроектах (buildJar), ​​и создание задачи в корне, которая будет вызывать только подпроекты other/*: buildJar

allprojects {
    task buildJar << { task -> println "$task.project.name" }
    if (project.name.startsWith("other/")) {
        task runBuildJar(dependsOn: buildJar) {}
    }
}

Это создает задачу "buildJar" для каждого проекта и "runBuildJar" только для других проектов /*, поэтому вы можете вызвать:

$ gradle runBuildJar
:other/projC:buildJar
other/projC
:other/projC:runBuildJar
:other/projD:buildJar
other/projD
:other/projD:runBuildJar

Ваш вопрос может быть прочитан многими способами, надеюсь, что это покрывает их все:)

Ответ 2

Я нашел этот вопрос сегодня, потому что у меня такая же проблема. Все способы, упомянутые Марк, могут быть использованы, но все они имеют некоторые минусы. Поэтому я добавляю еще один вариант:

4. Переключение текущего проекта

gradle -p other hello

Это переключает "текущий проект", а затем запускает все задачи с именем hello в текущем проекте.

Ответ 3

Если мы реализуем мультипроект в модуле proj-subproject и извлекаем все обычные вещи в корневой проект build.gradle

Я знаю, что мы можем выполнить из корневого проекта,

что делать, чтобы мы могли выполнить тот же проект из подпроекта?