我有一个项目,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
任务;我应该能够运行processTestResources
或test
任务,并将所有测试资源复制到输出文件夹中。
这是Gradle中的错误吗?
更新日期:
这里有一个link to the relevant issue in GH(因为这不是一个真正的bug,所以关闭为无效,正如接受的答案中所解释的)。
1条答案
按热度按时间du7egjpx1#
问题在于Groovy解释“违规行”的方式:如果没有括号,Groovy将
from
后面的所有内容都解释为参数,因此它获取对processTestResources
任务的引用,对其应用配置闭包,然后将结果传递给from
。因此,最终结果是您配置了内联
processTestResources
,而不是配置from
。添加括号会更改含义,因为它清楚地表明使用任务调用
from
的结果就是要配置的内容: