【问题标题】:Gradle multiproject gives "Could not find property 'sourceSets' on project" errorGradle multiproject 给出“在项目中找不到属性‘sourceSets’”错误
【发布时间】:2013-02-27 03:32:44
【问题描述】:

我有很好的 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
    }
}

我用它来运行测试,在这些测试中我使用来自其他项目的类。如果我删除该行,则构建仅在到达使用 MovedProject 的项目的 compileTestJava 任务时才会失败。如果我删除该行并致电gradle :Libraries/MovedLibrary:properties 我可以看到:

...
sourceCompatibility: 1.7
sourceSets: [source set main, source set test]
standardOutputCapture: org.gradle.logging.internal.DefaultLoggingManager@1e263938
...  

gradle :Libraries/MovedLibrary:build 正确构建。

目前我的一切设置如下:

  1. 目录:

    • /SomeMainProject1
    • /SomeMainProject2
    • /SomeMainProject3
    • /库
      • /已移动项目
        • build.gradle
        • dependencies.gradle
        • project.gradle
        • tasks.gradle
    • /生成器
      • dependencies.gradle
      • project.gradle
      • tasks.gradle
    • build.gradle
    • settings.gradle
  2. settings.gradle

    include Libraries/MovedProject,
            SomeMainProject1,
            SomeMainProject2,
            SomeMainProject3
    
  3. MovedProject 的源集在Libraries/MovedProject/project.gradle 中定义:

    sourceSets {
        main {
            java {
                srcDir 'src'
                srcDir 'resources'
            }
            resources { srcDir 'resources' }
        }
        test { java {
            srcDir 'test/unit'
        } }
    }
    
  4. 使用 sourceSets.test.output 的依赖项存储在 Builder/dependancies.gradle 中,并为每个需要 MovedProject 运行测试的项目设置:

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

摆脱该错误并使用当前目录结构制作 gradle 构建项目的最简单方法是什么?我想了解为什么 gradle 看不到该属性。

【问题讨论】:

    标签: gradle multi-project


    【解决方案1】:

    有问题的行是有问题的,因为它假设项目:Libraries/MovedLibrary 在当前项目之前已评估(未执行),但情况可能并非如此。如果不是,则尚未配置其他项目的源集。 (甚至没有 sourceSets 属性,因为尚未应用 java-base 插件。)

    一般来说,最好不要接触其他项目的项目模型,尤其是当它们不是当前项目的子项目时。如果项目 A 使用项目 B 的测试代码,建议的解决方案是让项目 B 公开一个测试 Jar(通过 artifacts {} 块),然后由项目 A 使用。

    如果您想保持原样,您可以使用gradle.projectsEvaluated {}project.evaluationDependsOn() 来解决此问题。请参阅Gradle Build Language Reference 了解更多信息。

    【讨论】:

    • 非常感谢!现在一切都建立起来了。使用project.evaluationDependsOn() 属性。我猜这个解决方案很脏,但我必须坚持一段时间。