Мы пытаемся использовать Gradle для нашего очень большого и сложного корпоративного приложения. Мы используем многопроектную структуру сборки и очень рады возможности параллельного выполнения Gradle.Параллельный режим Debug Gradle
Наша кодовая структурирована в области слоев, как это:
модули интерфейса (~ 20) -> общий пользовательский интерфейс -> домен -> DAO -> рамки
Зависимости являются уни Направленный и сборка происходит снизу вверх ,
К сожалению, мы не видим большого увеличения времени нашей сборки. Это в значительной степени то же самое, что и мы с ant.
Рассматривая последовательность выполнения задач в параллельном режиме, несколько вещей выглядят не так. Наше ожидание - Gradle будет запускать задачи последовательно, когда они строят основные слои. Таким образом, после того, как он собирает фреймворк, dao, домен и общий ui, он должен пинать все остальное параллельно.
Но последовательность выполнения мы видим несколько, как это:
framework.assemble -> dao.assemble -> domain.assemble -> shared.ui.assemble -> Другие modules.assmble UI (параллельно) -> war -> Other UI.check + shared.ui.check + dao.check (параллельно) -> domain.check -> framework.check
Узкое место находится в конце, когда выполняется проверка домена и рамки последовательно, а не параллельно. Эти 2 модуля являются самыми большими модулями для нас с 12k модульными тестами, и они занимают около 4 минут для запуска.
Мы потратили много времени на поиск зависимостей, используя задачи градации - все и тестовая задача для этих модулей полностью независимы, и нет ничего, что должно было бы остановить их выполнение.
Нам интересно, является ли это известной проблемой или есть способ включить дополнительную отладку в Gradle, чтобы получить больше информации о том, как Gradle определяет порядок выполнения в параллельном режиме. Любая помощь приветствуется.
** В частности, набор выполняемых задач в любое время не будет содержать две задачи, относящиеся к одному проекту. ** Это очень полезная информация. Итак, какова зернистость задач для проекта в параллельном режиме? Проверяется ли проверка задачи или теста или pmd? И как он отличается между корневым проектом и подпроектами? К сожалению, для нас ** maxParallelForks ** не работает вообще. Мы попытались установить его на минимальное полезное значение 2, а сборка не удалась повсюду. Он очень быстро ударяет «Слишком много открытых файлов в системной» ошибке на OSX. – abhi
Гранулярность задачи всегда одна и та же. Все 'check',' test', 'pmd' являются задачами (на самом деле я думаю, что это' pmdMain'). Нет никакой разницы между корневым проектом и подпроектами.Разумеется, график расчёта учитывается при распараллеливании, но кроме того, принудительное выполнение двух задач из одного и того же проекта параллельно. Какую версию Gradle вы используете? Если вы столкнулись с проблемой с 'maxParallelForks', пожалуйста, сообщите на http://forums.gradle.org. Также попробуйте увеличить максимальное количество открытых файлов (должно быть легко на * nix). –