【问题标题】:Clean task does not clean up specified outputs.file清理任务不清理指定的输出文件
【发布时间】:2014-11-09 16:19:17
【问题描述】:

我编写了一个 build.gradle 脚本来自动从给定的 URL 下载 hazelcast。之后文件被解压缩,只有 mancenter.war 和原始 zip 文件保留在目标目录中。后来这个战争文件被引用用于码头运行。

尽管如此,虽然我为我的两个任务定义了 output.file,但是当我执行 gradle clean 时,这些文件并没有被清理。因此,我想知道当我执行 gradle clean 时我必须做什么才能删除下载和解压缩的文件。这是我的脚本:

顺便说一句,如果您对如何增强脚本有任何建议,请随时告诉我!

apply plugin: "application"

dependencies {
    compile "org.eclipse.jetty:jetty-webapp:${jettyVersion}"
    compile "org.eclipse.jetty:jetty-jsp:${jettyVersion}"
}

ext {
    distDir = "${projectDir}/dist"

    downloadUrl = "http://download.hazelcast.com/download.jsp?version=hazelcast-${hazelcastVersion}"
    zipFilePath = "${distDir}/hazelcast-${hazelcastVersion}.zip"
    warFilePath = "${distDir}/mancenter-${hazelcastVersion}.war"

    mainClass = "mancenter.MancenterBootstrap"
}

task downloadZip() {
    outputs.file file(zipFilePath)
    logging.setLevel(LogLevel.INFO)
    doLast {
        ant.get(src: downloadUrl, dest: zipFilePath)
    }
}

task extractWar(dependsOn: downloadZip) {
    outputs.file file(warFilePath)
    logging.setLevel(LogLevel.INFO)
    doLast {
        ant.unzip(src: zipFilePath, dest: distDir, overwrite:"true") {
            patternset( ) {
                include( name: '**/mancenter*.war' )
            }
            mapper(type:"flatten")
        }
    }
}

task startMancenter(dependsOn: extractWar, type: JavaExec) {
    main mainClass
    classpath = sourceSets.main.runtimeClasspath
    args warFilePath
}

更新

我找到了这个link,它描述了如何在调用清理任务时提供额外的删除位置。基本上你可以做某事。像这样:

clean{
    delete zipFilePath
    delete warFilePath
}

【问题讨论】:

  • AFAIK,清理任务只是删除构建目录。您应该将所有输出存储在此构建目录下的某个位置。
  • 好提示,谢谢!会试试的。现在有办法指定要清理的额外资源吗?

标签: build gradle resource-cleanup


【解决方案1】:

我从源代码中得到确认,清理任务只是删除了构建目录。它假定您要清理所有内容,并且所有任务输出都在此构建目录中的某个位置。

因此,最简单和最佳的做法是仅将输出存储在构建目录下的某个位置。

【讨论】:

  • 认为最简单和最佳的做法是正确的。不过,我会采用我在更新问题中所述的方法。
  • 这将在配置阶段删除,而不是在执行阶段执行。应该是clean << { ... }
  • 我认为配置阶段是正确的阶段,因为您并没有真正删除文件,而只是指定它们以供以后删除。 gradle devs 也这样说,它也对我有用。
  • 我的错,你是对的。我错过了 Delete 任务有一个 delete() 方法的事实,它在这里被调用,而不是 Project.delete() 方法,它具有相同的签名但会立即删除文件。
【解决方案2】:

您可以像这样添加要清理的任务:

clean.dependsOn(cleanExtractWar)
clean.dependsOn(cleanDownloadZip)

cleanTaskName 是一个虚拟任务,将清除 TaskName 的所有输出。

【讨论】:

    猜你喜欢
    • 2013-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-17
    相关资源
    最近更新 更多