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

Gradle multiproject дает "Не удалось найти свойство" sourceSets 'on project "error

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

Во-первых, я переместил Project и его ресурсы в подпапку Libraries/MovedProject. После изменения некоторых строк в конфигурациях gradle он работал нормально. Но потом я решил написать новый build.gradle только для этого проекта и переместить все конфигурации там из основного.

И тут все перестало работать. Когда я пытаюсь вызвать любую задачу, она всегда заканчивается с Could not find property 'sourceSets' on project ':Libraries/MovedProject'. Линия, которая отвечает за это:

dependencies {
    ...
    if (noEclipseTask) {
        testCompile project(':Libraries/MovedLibrary').sourceSets.test.output
    }
}

который я использую для запуска тестов, в которых я использую классы из других проектов. Если я удалю эту строку, сборка завершится неудачей, только когда она достигнет задачи compileTestJava проектов, которые используют MovedProject. Если я удалю эту строку и вызову gradle :Libraries/MovedLibrary:properties, я увижу:

...
sourceCompatibility: 1.7
sourceSets: [source set main, source set test]
standardOutputCapture: [email protected]
...  

в то время как gradle :Libraries/MovedLibrary:build строит правильно.

В настоящее время у меня все настроено так:

  • каталоги:

    • /SomeMainProject1
    • /SomeMainProject2
    • /SomeMainProject3
    • /Библиотеки
      • /MovedProject
        • build.gradle
        • dependencies.gradle
        • project.gradle
        • tasks.gradle
    • /Builder
      • dependencies.gradle
      • project.gradle
      • tasks.gradle
    • build.gradle
    • settings.gradle
  • settings.gradle

    include Libraries/MovedProject,
            SomeMainProject1,
            SomeMainProject2,
            SomeMainProject3
    
  • sourceSets для MovedProject определены в Libraries/MovedProject/project.gradle:

    sourceSets {
        main {
            java {
                srcDir 'src'
                srcDir 'resources'
            }
            resources { srcDir 'resources' }
        }
        test { java {
            srcDir 'test/unit'
        } }
    }
    
  • зависимости, которые используют sourceSets.test.output, хранятся в Builder/dependancies.gradle и устанавливаются для каждого проекта, который требует MovedProject для запуска тестов:

    project(':SomeMainProject1') {
        dependencies {
            ...
    
            if (noEclipseTask) {
                testCompile project(':Libraries/net.jsdpu').sourceSets.test.output
            }
        }
    }
    

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

4b9b3361

Ответ 1

Соответствующая строка является проблематичной, поскольку она предполагает, что проект :Libraries/MovedLibrary оценивается (не выполняется) перед текущим проектом, что может и не быть. И если это не так, исходные наборы другого проекта еще не настроены. (Это свойство даже не будет sourceSets, потому что плагин java-base еще не применен.)

В целом, лучше не привлекать проектные модели других проектов, особенно если они не являются детьми текущего проекта. В случае проекта A, использующего тестовый код проекта B, рекомендуемое решение состоит в том, чтобы проект B выставлял тестовую Jar (через блок artifacts {}), который затем потреблялся проектом A.

Если вы хотите сохранить все, как есть, вы можете решить эту проблему, используя gradle.projectsEvaluated {} или project.evaluationDependsOn(). Дополнительную информацию см. В Gradle Справочник по языку сборки.