警告:Gradle新手......: - )
我正在将现有项目从Ant转换为Gradle。我的项目的很大一部分由生成的代码组成。此代码生成到内部目录中,并完成本地构建以确保正确生成代码。验证本地测试版本后,生成的代码将复制到一组WAR项目中以进行最终部署。
因此,作为构建的一部分,我有一个任务将文件从测试版本复制到WAR项目。在制作副本时,只有一些文件只有在目标WAR项目中不存在时才能复制。为此,我编写了以下Gradle复制任务:
task copyServer (type: org.gradle.api.tasks.Copy) {
group = 'ds_copy'
String serviceRootDir = "${DS_ROOT_DIR}/NDMS_DS_Generated_Services/server_src/${x_dsServiceDir}"
String serviceDestDir = "${DS_ROOT_DIR}/NDMS_DS_Client/srv_src/${x_dsServiceDir}"
FileTree setupFiles = fileTree ("$serviceRootDir") {
include "gen/**/*.java", "request/gen/**.java"
}
doFirst {
File appFile = new File (serviceDestDir, "${dsName}App.java")
if (appFile.exists () == false)
{
setupFiles = fileTree (dir: "$serviceRootDir", include: ["gen/**/*.java", "request/gen/**.java", "${dsName}App.java"])
}
println ("Copying service classes for ${dsName} from ${serviceRootDir}")
println ("Files to copy: ")
setupFiles.each { println (it) }
println (setupFiles)
}
from (setupFiles)
into (serviceDestDir)
doLast {
println ("Finished copying service classes for ${dsName}")
}
}
我的问题是我似乎无法从 doFirst 块更新fileTree,以便检查目标中是否存在文件。即使我看到 setupFiles 更新,但是当复制发生时,我在 doFirst 块中添加的文件也不会被复制。
有没有办法修改copyTask正在使用的fileTree?
答案 0 :(得分:1)
永远不要尝试从执行阶段更改任务配置,尤其是在更改输入或输出时。这将打破最新的检查,我认为Gradle在最近的版本中甚至主动禁止这一点。
创建第二个生成文件的任务,然后通过配置使copyServer任务包含该任务的输出。如果你正确地做了,你甚至不需要显式的任务依赖,因为它应该隐式添加。
实际上你的复制任务应该更像
task copyServer(type: Copy) {
group = 'ds_copy'
from serviceRootDir
into serviceDestDir
include 'gen/**/*.java'
include 'request/gen/**.java'
include "${dsName}App.java"
doLast {
println "Finished copying service classes for $dsName"
}
}
顺便说一下。 Ant的一个提示 - > Gradle转换。学习Gradle,忘记你的Ant buildcript,用Gradle的Gradle方式从头开始创建你的构建。如果您尝试移植现有的Ant构建,那么很可能最终会出现非常难看的Gradle构建,这些构建的效率可能会低得多。