22

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

首先,我将 Project 及其资源移至 subfolder 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
    • /图书馆
      • /已移动项目
        • 构建.gradle
        • 依赖项.gradle
        • 项目.gradle
        • 任务.gradle
    • /建造者
      • 依赖项.gradle
      • 项目.gradle
      • 任务.gradle
    • 构建.gradle
    • 设置.gradle
  2. 设置.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 看不到该属性。

4

1 回答 1

24

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

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

如果您想保持原样,您可以使用gradle.projectsEvaluated {}or来解决问题project.evaluationDependsOn()。有关更多信息,请参阅Gradle 构建语言参考

于 2013-03-12T12:48:45.957 回答