How do I extend gradle's clean task to delete a file?

匿名 (未验证) 提交于 2019-12-03 02:54:01

问题:

So far i've added the following to my build.gradle

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

However not only is my file not deleted, but the print statement shows that ${rootDir} is not being converted to the root directory of my project. Why won't this work, what concepts am I missing?

回答1:

You just need to use double quotes. Also, drop the << and use doFirst instead if you are planning to do the deletion during execution. Something like this:

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

Gradle build scripts are written in Groovy DSL. In Groovy you need to use double quotes for string interpolation (when you are using ${} as placeholders). Take a look at here.



回答2:

<< is equivalent for clean.doLast. doFirst and doLast are ordering the operations at the execution phase, which is seldom relevant for delete operations.

In this case you don't need any of them. The clean task from base is of type Delete, so you simply need to pass it a closure to tell it at configuration time what to delete when it executes:

clean {     delete 'someFile' } 

AS mushfek0001 correctly points it out in his answer, you should use double quotes for variable interpolation to work:

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

You need to have at least the base plugin applied for this to work, most other plugins, like the Java plugin either apply base or declare their own clean task of type delete Delete task. The error you would get if you don't have this is a missing clean method one.

apply plugin: 'base' 


回答3:

In order to extend the clean task, you can use

clean.doFirst {} 

or

clean.doLast {} 

These will allow you to inject your own actions into the clean process. In order to delete files and directories you can use the "file" API which doesn't require any additional plugins.

Here is an example that will delete both a file and a directory as the last step in the clean task:

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


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!