【问题标题】:How do I extend gradle's clean task to delete a file?如何扩展 gradle 的 clean 任务以删除文件?
【发布时间】:2015-07-01 00:47:52
【问题描述】:

到目前为止,我已将以下内容添加到我的 build.gradle

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

但是,不仅我的文件没有被删除,而且打印语句显示${rootDir} 没有被转换到我的项目的根目录。为什么这不起作用,我缺少什么概念?

【问题讨论】:

    标签: gradle build.gradle


    【解决方案1】:

    在 gradle 中有一些选项,您可以使用 doFirst(在实际任务之前)、doLast(在实际任务之后)扩展特定任务(在您的情况下为“干净”)。

    你只需要用双引号替换单引号。

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

    【讨论】:

      【解决方案2】:

      下面一个对我有用(我更喜欢使用dependsOn),

      task customCleanUp(type:Delete) {
         delete "your_folder", "your_file"
      }
      
      tasks.clean.dependsOn(tasks.customCleanUp)
      

      【讨论】:

        【解决方案3】:

        Gradle Kotlin 脚本模拟:

        tasks {
            getByName<Delete>("clean") {
                delete.add("logs") // add accepts argument with Any type
            }
        }
        

        【讨论】:

        • 也可以通过索引获取clean任务:tasks["clean"]...
        【解决方案4】:

        你只需要使用双引号。此外,如果您打算在执行期间进行删除,请删除 &lt;&lt; 并改用 doFirst。像这样的:

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

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

        【讨论】:

        • 不确定。它将在 configuration 阶段删除文件,而不是在执行期间。
        • 以上评论不属实。 doFirst 仅在execution 阶段进行评估。 调用doFirst 和doLast 可以多次执行。他们将动作添加到任务动作列表的开头或结尾。当任务执行时,动作列表中的动作按顺序执行。 from docs
        【解决方案5】:

        &lt;&lt; 等同于clean.doLastdoFirstdoLast 正在对执行阶段的操作进行排序, 这很少与删除操作相关。

        在这种情况下,您不需要其中任何一个。 来自 base 的 clean 任务的类型为 Delete, 所以你只需要传递一个闭包来告诉它在配置时间执行时要删除什么:

        clean {
            delete 'someFile'
        }
        

        AS mushfek0001 在他的回答中正确指出,您应该使用双引号进行变量插值:

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

        您至少需要应用基本插件才能工作,大多数其他插件,如 Java 插件要么应用基本插件,要么声明自己的插件 clean 类型的任务删除 Delete 任务。如果你没有这个,你会得到的错误是缺少clean 方法一。

        apply plugin: 'base'
        

        【讨论】:

        • delete '${buildDir}/someFile' 不会解析buildDir 的变量。您需要在这里使用",例如delete "$buildDir/someFile"
        • ' 的错字更正为"GStrings 需要双 wuotes
        • 但是这样你就完全替代了 clean 的默认行为。如果他还有更多任务怎么办?
        • 正如文档中所指出的,Delete 任务的delete 方法: > 添加一些要被此任务删除的文件。因此,这不会取代以前的行为(即以前要删除的文件列表),它只是添加到它。
        • 这导致我出错:Could not find method clean() for arguments [build_6vh7849xb7rs3m0ite221ir66$_run_closure6@20f01807]
        【解决方案6】:

        为了扩展清理任务,可以使用

        clean.doFirst {}
        

        clean.doLast {}
        

        这些将允许您将自己的操作注入到干净的过程中。为了删除文件和目录,您可以使用不需要任何额外插件的“文件”API。

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

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

        【讨论】:

          猜你喜欢
          • 2023-03-09
          • 1970-01-01
          • 2015-02-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多