2017-09-11 42 views
1

我在摇篮已经一个简单的任务:删除任务总是UP-TO-DATE

task cleanBuild(type: Delete) { 
    def build = ".src/buildfiles" 
    FileTree tree = fileTree (dir: dbEditorBuild); 
    tree.each { File file -> 
     println file 
    } 
} 

当我运行它,我得到这个输出:

:user:cleanBuild UP-TO-DATE 
BUILD SUCCESSFUL 

Total time: 1.656 secs 

我读过的文档它说任务结果被缓存以获得性能。我想重新执行任务,但我不能。尽管编辑了任务代码,所以,很明显,Gradle似乎无法检测到任务已经改变,哪种吸吮。

我试过推荐别人,像添加此行的任务是:

outputs.upToDateWhen { false } 

但它不会有任何效果。

+0

你认为该任务做什么? – LazerBanana

+0

我期待任务结果不被Gradle缓存。我正在尝试编写一个任务。以前,我想删除变量'build'下树中的所有文件(包括目录),但'delete'似乎只删除纯文件(而不是目录)。 – Ammaro

+0

结果未被缓存,因为您没有指定任何要删除的文件,因此您的任务完全没有任何操作。我假设你的文件树根本找不到任何文件。 –

回答

2

您可以定义类型为Delete的任务,但不会定义任何要删除的文件。这就是为什么你的任务总是最新的原因,因为它没有任何关系。您可以定义通过delete方法删除哪些文件。你通过这种方法,一切都会通过Project.files(...)进行评估:

task myDelete(type: Delete) { 
    delete 'path/to/file', 'path/to/other/file' 
} 

请注意,您的代码示例不与上最新的检查干扰,它甚至不与任务干扰的。由于您未使用闭包,因此您正在使用任务的配置关闭,该任务在配置阶段期间执行。由于您也没有使用任何任务方法,因此如果将代码置于任务配置关闭之外,则代码将完全相同。

作为一个小的补充:即使这个特定的问题不是由Gradle最新的检查引起的,也可以强制Gradle执行所有任务,忽略任何任务优化:只需将--rerun-tasks作为命令行参数如the docs中所述。

+0

的确,我认为在这之前有一个不同的任务。 – LazerBanana

1

如果您尝试删除一些未使用默认clean任务删除的其他文件(因为它只删除build目录),则可以扩展清理任务以删除其他内容。

clean { 
    delete += "$buildDir" 
    delete += "$rootDir/someDir/someClass.java" 
    delete += "$rootDir/otherDir 
} 

或创建新任务delete文件和dependOn它放在构建生命周期。

task deleteSomething(type: Delete) { 
    // to delete a file 
    delete 'uglyFolder', 'uglyFile' 
    // to delete a directory 
    delete 'uglyFolder' 
    followSymlinks = true 
} 

是默认的符号链接不会被删除文件时遵循。要更改此行为,请使用true调用Delete.setFollowSymlinks(boolean)。在不支持符号链接的系统上,这将不起作用。

或者您可以将操作置于执行阶段并删除它。

task cleanBuild { 
    def build = new File("$rootDir/src/buildfiles") 
    doLast{ 
     build.deleteDir() 
    } 
} 

而且,可以肯定的任务有东西,因为如果做任务无关,没有什么可删除等将打印UP-TO-DATE @ lu.koerfer答案解释它完美。

+0

尽管最终目标是删除一些文件,但这并不完全是我想要的。我想让这个任务再次由Gradle运行。 – Ammaro

+0

@Ammaro如果你的任务是UP-TO-DATE,这意味着输出/输入没有改变或任务完全没有任何改变。 – LazerBanana

+0

我改变了任务代码,但它仍然说它是最新的。这是为什么? – Ammaro