Зависимости многомодульных задач - PullRequest
0 голосов
/ 24 апреля 2018

Я хочу, чтобы результаты одной задачи были доступны для идентичной задачи в другом подмодуле.

Я пытаюсь создать еще один плагин для компиляции (из C / ++, .hs,.coffee, .js и др.) И генерация исходного кода.Итак, я делаю плагин и задачу / с, которые (пока) генерируют CMakeLists.txt, Android.mk, .vcxproj или что-то еще для каждого модуля для создания исходного кода.

У меня есть мульти-модуль для этого.Я могу искать и находить задачи из «других» подмодулей, но, похоже, не могу принудительно выполнить какой-либо порядок выполнения.

Итак, с ...

  • root project: RootModule
    • подпроект: NativeCommandLine (требуется SharedModule)
    • подпроект: NativeGUI (требуется SharedModule)
    • подпроект: SharedModule

... Я считаю, что задачи NativeGUI выполняются до SharedModule, что означает, что результаты SharedModule не готовы.

Плох.

Сdependency { ... } происходит после установки плагинов (AFAIK) ... Я предполагаю, что зависимости подключаются после.

Мне нужно, чтобы мои задачи выполнялись в порядке, основанном на отношениях зависимостей ... верно?Как я могу это сделать?

1 Ответ

0 голосов
/ 01 августа 2018

Я создал (scala) TaskBag, который лениво регистрирует коллекцию всех участвующих Task экземпляров. К этому я добавляю экземпляры своей задачи вместе с обработчиком, когда появляется новая задача.

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

package peterlavalle

import java.util

import org.gradle.api.Task

object TaskBag {

    class AnchorExtension extends util.LinkedList[(Task, Task => Unit)]()

    /**
        * connect to the group of tasks
        */
    def apply(task: Task)(react: Task => Unit): Unit =
        synchronized {
            // lazily create the central anchor ... thing ...
            val anchor: AnchorExtension =
                task.getProject.getRootProject.getExtensions.findByType(classOf[AnchorExtension]) match {
                    case null =>
                        task.getProject.getRootProject.getExtensions.create(classOf[AnchorExtension].getName, classOf[AnchorExtension])
                    case anchor: AnchorExtension =>
                        anchor
                    }

            // show us off to the old ones
            anchor.foreach {
                case (otherTask, otherReact) =>
                    require(otherTask != task, "Don't double register a task!")
                    otherReact(task)
                    react(otherTask)
            }

            // add us to the list
            anchor.add(task -> react)
        }

}
...