Gradle未将所有测试资源复制到输出目录

kxkpmulp  于 2022-11-14  发布在  其他
关注(0)|答案(1)|浏览(146)

我有一个项目,Gradle没有将所有测试资源复制到输出目录,我不知道是我做错了什么,还是Gradle中有bug。目录结构如下:

gradle/     # (contains Gradle wrapper files)
src/
    hello/
        Hello.java
tests/
    hello/
        hello.txt
    foo/
        bar.txt
build.gradle
gradlew
gradle.bat

build.gradle的内容如下:

apply plugin: 'java'

sourceSets {
    main {
        java.srcDirs = ['src']
        resources.srcDirs = ['src']
        resources.excludes = ['**/*.java']
    }
    test {
        java.srcDirs = ['tests']
        resources.srcDirs = ['tests']
        resources.excludes = ['**/*.java']
    }
}

task staging (type: Copy) {
    from processResources
    from processTestResources { include 'foo/' } // Offending line

    into "${buildDir}/staging"
}

task run (type: JavaExec) {
    dependsOn staging

    // [...]
}

当我跑步时:

./gradlew processTestResources    # or just ./gradlew test

只有tests/foo中的资源会被复制到输出文件夹。tests/hello中的资源不会被复制。
但是,如果我注解掉暂存任务中标记为“冒犯行”的行,则会复制所有资源。
这是预期的行为吗?看起来Gradle正在尝试计算需要哪些资源,并看到staging任务只需要tests/foo。但我没有运行staging任务;我应该能够运行processTestResourcestest任务,并将所有测试资源复制到输出文件夹中。
这是Gradle中的错误吗?

更新日期:

这里有一个link to the relevant issue in GH(因为这不是一个真正的bug,所以关闭为无效,正如接受的答案中所解释的)。

du7egjpx

du7egjpx1#

问题在于Groovy解释“违规行”的方式:如果没有括号,Groovy将from后面的所有内容都解释为参数,因此它获取对processTestResources任务的引用,对其应用配置闭包,然后将结果传递给from
因此,最终结果是您配置了内联processTestResources,而不是配置from
添加括号会更改含义,因为它清楚地表明使用任务调用from的结果就是要配置的内容:

from(processTestResources) { include 'foo/' }

相关问题