Gradle multiproject提供“无法在项目中找到属性'sourceSets'错误

时间:2013-03-11 19:52:34

标签: gradle multi-project

我有很好的gradle配置,它构建了一切就好了。但是我的多项目构建中的一个项目来自其余的项目,我很乐意将它移动到另一个git repo并配置子模块来处理它。

首先,我将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
    • /库
      • / MovedProject
        • 的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的sourceSets在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
            }
        }
    }
    
  5. 摆脱该错误并使用当前目录结构制作gradle构建项目的最简单方法是什么?我想明白为什么gradle看不到那个属性。

1 个答案:

答案 0 :(得分:19)

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

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

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