2015-04-23 757 views
23

到目前为止,我已经添加了以下到我的build.gradle如何扩展gradle的clean任务来删除文件?

apply plugin: 'base' 
clean << { 
    delete '${rootDir}/api-library/auto-generated-classes/' 
    println '${rootDir}/api-library/auto-generated-classes/' 
} 

然而,不仅是我的文件不会被删除,但打印声明显示,${rootDir}没有被转化为我的项目的根目录下。为什么不行,我缺少什么概念?

回答

32

你只需要使用双引号。另外,如果您打算在执行期间执行删除操作,请删除<<并使用doFirst。例如:

clean.doFirst { 
    delete "${rootDir}/api-library/auto-generated-classes/" 
    println "${rootDir}/api-library/auto-generated-classes/" 
} 

Gradle构建脚本是用Groovy DSL编写的。在Groovy中,您需要使用双引号进行字符串插值(当您使用${}作为占位符时)。看看here

+1

不知道这件事。它将在* configuration *阶段删除文件,而不是在执行过程中。 – Opal

21

<<相当于clean.doLastdoFirstdoLast订购执行阶段的操作, 这很少与删除操作相关。

在这种情况下,你不需要任何人。 从基本的清洁工作是Delete型, 所以你只需要通过它的闭合来告诉它在配置时间删除的内容在执行时:

clean { 
    delete 'someFile' 
} 

AS mushfek0001正确指出它在他的回答,你应该使用双引号的变量代换工作:

clean { 
    delete "${buildDir}/someFile" 
} 

你需要有至少应用于此基础插件工作,其他大多数的插件,如Java插件或者应用基础或声明自己 clean任务类型删除Delete任务。如果你没有这个错误,你会得到一个错误clean方法一。

apply plugin: 'base' 
+1

'delete'$ {buildDir}/someFile''不会解析'buildDir'的变量。你需要在这里使用'''',例如'delete'$ buildDir/someFile“' –

+0

将'''的拼写错误纠正为''''。双重wuotes需要[GStrings](http://docs.groovy-lang.org/latest/html/api/groovy/lang/GString。html) – Alpar

+0

但是这样你完全替换了clean的默认行为。如果他有更多的附加任务呢? – mushfek0001

7

为了延长清洁任务时,可以使用

clean.doFirst {} 

clean.doLast {} 

这将使你注入自己的行动纳入清洁过程。为了删除文件和目录,您可以使用不需要任何额外插件的“文件”API。

这里是一个将同时删除文件和目录在清理任务的最后一步一个例子:

clean.doLast { 
    file('src/main/someFile.txt').delete() 
    file('src/main/libs').deleteDir() 
}