Ser*_*kov 8 gradle build.gradle
我准备了一个非常简单的脚本,它说明了我使用Gradle 1.7看到的问题(需要坚持使用它,因为有些插件还没有支持更新的版本).
我正在尝试动态创建任务,每个任务对应于项目目录中的文件.这样可以正常工作,但是我创建的任务永远不会在我为其分配类型"复制"时执行.
这是我的问题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'
Run Code Online (Sandbox Code Playgroud)
通过这种方式,当我简单地调用默认任务调用时,我的任务不会被执行gradle:
MYDISTALL
:myDist-template1 UP-TO-DATE
:myDist-template2 UP-TO-DATE
:distAll UP-TO-DATE
BUILD SUCCESSFUL
Run Code Online (Sandbox Code Playgroud)
如果我Copy从动态任务中删除类型(取消注释上面的行),我的任务就会被执行:
MYDISTALL
:myDist-template1
MYDIST-template1
:myDist-template2
MYDIST-template2
:distAll
BUILD SUCCESSFUL
Run Code Online (Sandbox Code Playgroud)
(您需要templates在所在的同一目录中创建一个文件夹名称build.gradle,并将几个空文件放入其中以便运行测试)
根据调试输出:
跳过任务':myDist-template1',因为它没有源文件.
跳过任务':myDist-template2',因为它没有源文件.
那么如何指定源文件并使我的Copy任务执行?我试过添加
from( '/absolute/path/to/existing/file' ) {
into 'myfolder'
}
Run Code Online (Sandbox Code Playgroud)
对于任务组,我已经尝试分配任务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
}
}
}
Run Code Online (Sandbox Code Playgroud)
但它看起来我必须始终指定from/ into.在doLast {}体中这样做是不够的.
Pet*_*ser 12
一个Copy任务,只有同时具备东西复制得到执行.告诉它要复制什么是配置任务的一部分,因此需要在配置阶段而不是执行阶段完成.这些是非常重要的概念,您可以在Gradle用户指南或Gradle论坛中阅读这些概念.
doFirst并且doLast块在执行阶段执行,作为执行任务的一部分.两者都来不及告诉任务要复制什么:doFirst在主任务操作之前立即执行(在这种情况下是复制),但是(很快)在skipped和up-to-date检查之后执行(基于任务的配置).doLast在主要任务动作之后执行,因此显然为时已晚.
| 归档时间: |
|
| 查看次数: |
10419 次 |
| 最近记录: |