Зависит от нескольких задач в сборке нескольких проектов

В настоящее время у меня есть задача, которая запускает сервер Google Cloud, запускает тесты и останавливает сервер. Определяется в корневом проекте:

buildscript {...}
allprojects {...}

task startServer (dependsOn: "backend:appengineStart") {}
task testPaid (dependsOn: "app:connectedPaidDebugAndroidTest") {}
task stopServer (dependsOn: "backend:appengineStop") {}
task GCEtesting {
    dependsOn = ["startServer",
                 "testPaid",
                 "stopServer"]
    group = 'custom'
    description 'Starts GCE server, runs tests and stops server.'
    testPaid.mustRunAfter 'startServer'
    stopServer.mustRunAfter 'testPaid'
}

Я попробовал несколько способов написать что-то вроде этого, коротко с одной задачей. Я не понял, как ссылаться на задачу из другого проекта и вызывать для нее mustRunAfter. Это не работает (я также пытался ссылаться на Project.tasks.getByPath, root.tasks и т. Д.):

task GCEtesting {
    dependsOn = ["backend:appengineStart",
                 "app:connectedPaidDebugAndroidTest",
                 "backend:appengineStop"]
    group = 'custom'
    description 'Starts GCE server, runs tests and stops server.'
    "app:connectedPaidDebugAndroidTest".mustRunAfter "backend:appengineStart"
    "backend:appengineStop".mustRunAfter "app:connectedPaidDebugAndroidTest"
}

Является ли это возможным? Какой правильный синтаксис, чтобы заставить это работать?

1 ответ

Решение

Похоже, ваша проблема в том, что вы лечите dependsOn в значении "вызвать эту задачу". Фактически это означает, что "убедитесь, что результат зависимой задачи доступен до запуска зависимой задачи". Вот почему ваше первое решение не сработало: заявления вроде testPaid.mustRunAfter влияет только на действия testPaid Сама задача, а не ее зависимости.

Во всяком случае, вы можете получить поведение, которое вы хотите, используя dependsOn а также finalizedBy, но они должны быть объявлены в файле сборки подпроекта приложения.

Приложение / build.gradle:

task connectedPaidDebugAndroidTest {
    //
    //...
    //

    dependsOn 'backend:appengineStart' // Ensure appengineStart is run at some point before this task
    finalizedBy 'backend:appendginStop' // Ensure appengineStop is run at some point after this task
}

Затем вы можете запустить свои тесты просто с gradle app:connectedPaidDebugAndroidTest, Если вы действительно хотите определить задачу в корневом проекте для запуска тестов, то это тоже легко:

build.gradle:

task GCEtesting {
    dependsOn = "app:connectedPaidDebugAndroidTest"
}
Другие вопросы по тегам