Почему Gradle разрешает зависимости в порядке имен модулей по умолчанию? - PullRequest
1 голос
/ 04 мая 2020

У меня есть три модуля:

  • amodule
  • bmodule
  • cmodule

Там являются интеграционными тестами во всех этих трех модулях. bmodule является базой - он содержит BaseClass, который я хочу использовать в интеграционных тестах в amodule и cmodule

Пример моего проекта на github: https://github.com/ljql/test-deps

Я пытаюсь добавить зависимость к интеграционным тестам bmodule в amodule и cmodule. Файл build.gradle выглядит одинаково в модулях amodule и cmodule

sourceSets {
    intTest {
        java {
            srcDir 'src/test-integration/java'
        }
        resources {
            srcDir 'src/test-integration/resources'
        }
        compileClasspath += rootProject.project('bmodule').sourceSets.intTest.output
        runtimeClasspath += rootProject.project('bmodule').sourceSets.intTest.output
    }
}

configurations {
    intTestCompile {
        extendsFrom compile
    }
    intTestRuntime {
        extendsFrom runtime
    }
}

dependencies {
    intTestCompile project(path: ':bmodule', configuration:  'intTestCompile')
}

Но когда я пытаюсь собрать amodule, у меня появляется ошибка:

Build file '/test-deps/amodule/build.gradle' line: 10

A problem occurred evaluating project ':amodule'.
> Could not get unknown property 'intTest' for SourceSet container of type org.gradle.api.internal.tasks.DefaultSourceSetContainer.

Сборка cmodule, которая является копией amodule, успешно завершена.

Единственное отличие между amodule и cmodule заключается в их именах. amodule предшествует bmodule и cmodule, за которыми следует bmodule

Как я могу указать последовательность зависимостей разрешения gradle в моем случае? Я хочу, чтобы gradle узнал сначала о bmodule, а затем о amodule и cmodule

Ответы [ 3 ]

0 голосов
/ 04 мая 2020

У вас есть проблема с заказом оценки проекта. Поскольку и amodule, и cmodule ожидают найти определенные c компоненты bmodule, вам нужно попросить Gradle убедиться, что bmodule был оценен первым.

Вы можете добавить в сборку файлы amodule и cmodule следующие:

evaluationDependsOn(':bmodule')

Хотя Gradle предлагает API для решения этой проблемы, он будет работать, только если у вас нет цикла, то есть bmodule не имеет зависимостей от либо amodule, либо cmodule, в противном случае вы не сможете найти решение таким образом.

Другой подход заключается в использовании надлежащего разрешения зависимостей и объявлении о том, что вы хотите поделиться некоторыми тестовыми классами, имея их выставлен в качестве тестовых приспособлений например.

0 голосов
/ 06 мая 2020

Gradle имеет три фазы сборки:

  • Инициализация
  • Конфигурация
  • Выполнение

Но окончательный результат разрешения всех зависимостей появляется только когда gradle завершает все три фазы.

Ошибка указывает на строку в sourceSets - это из фазы Configuration. В начале этого этапа gradle ничего не знает ни о каких конфигурациях во всех модулях. И Gradle узнает о содержании каждого модуля последовательно модуль за модулем. Конечно, когда gradle впервые рассматривает конфигурацию amodule, он ничего не знает ни о каких конфигурациях в bmudule.

. В вопросе я хочу определить compileClasspath и runtimeClasspath в конфигурации :amodule:intTest. Но ничто не мешает мне определить это в пользовательском задании. Gradle выполнит его на третьем этапе, а финальные compileClasspath и runtimeClasspath будут содержать информацию из bmodule:intTest

Результат build.gradle из amodule:

sourceSets {
    intTest {
        java {
            srcDir 'src/test-integration/java'
        }
        resources {
            srcDir 'src/test-integration/resources'
        }
    }
}

configurations {
    intTestCompile {
        extendsFrom compile
    }
    intTestRuntime {
        extendsFrom runtime
    }
}

task intTest {
    sourceSets.intTest.compileClasspath += rootProject.project('bmodule').sourceSets.intTest.output
    sourceSets.intTest.runtimeClasspath += rootProject.project('bmodule').sourceSets.intTest.output
}
0 голосов
/ 04 мая 2020

Попробуйте добавить это в build.gradle вашего amdoule

preBuild.dependsOn ":bmodule:build"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...