我准备了一个非常简单的脚本,演示了我在使用Gradle 1.7时遇到的问题(由于一些插件尚未支持更新版本,因此需要坚持使用它)。
我正在尝试动态创建任务,每个任务对应项目目录中的一个文件。这很好用,但是我创建的任务只要将它们指定为“Copy”类型,就无法执行。
这是我的问题:build.gradle
:
file('templates').listFiles().each { File f ->
// THIS LINE DOES NOT WORK
task "myDist-${f.name}" (type: Copy) {
// NEXT LINE WORKS
//task "myDist-${f.name}" {
doLast {
println "MYDIST-" + f.name
}
}
}
task distAll(dependsOn: tasks.matching { Task task -> task.name.startsWith("myDist")}) {
println "MYDISTALL"
}
defaultTasks 'distAll'
这样做可以避免在我简单调用gradle
的默认任务时执行我的任务:
MYDISTALL
:myDist-template1 UP-TO-DATE
:myDist-template2 UP-TO-DATE
:distAll UP-TO-DATE
BUILD SUCCESSFUL
如果我从动态任务中移除类型
Copy
(取消上面的注释),我的任务将被执行:MYDISTALL
:myDist-template1
MYDIST-template1
:myDist-template2
MYDIST-template2
:distAll
BUILD SUCCESSFUL
您需要在与
build.gradle
位于同一目录下创建一个名为templates
的文件夹,并将几个空文件放到其中,以便运行测试。根据调试输出:
那么我该如何指定源文件并使我的跳过任务“:myDist-template1”,因为它没有源文件。
跳过任务“:myDist-template2”,因为它没有源文件。
Copy
任务执行?
我已经尝试添加了。from( '/absolute/path/to/existing/file' ) {
into 'myfolder'
}
针对任务主体,我尝试过使用inputs.source file('/my/existing/file')
来指定任务,但没有成功。请问如何修改我的简单脚本,保留动态任务创建并保持任务类型为Copy
?
谢谢!
编辑: 好的,这样任务会被调用:
file('templates').listFiles().each { File f ->
task "myDist-${f.name}" (type: Copy) {
from f
into 'dist'
doLast {
println "MYDIST-" + f.name
}
}
}
但是看起来我必须总是指定from
/into
。在doLast{}
中这样做是不够的。