groovy 如何使用任务分级删除文件

gwo2fgha  于 7个月前  发布在  其他
关注(0)|答案(2)|浏览(88)

我正在尝试使用gradle任务删除文件

task remove {
    exec {
        working dir file/file2
        commandLine 'myFirstCommandLineWhichWorks'
        commandLine "rm", "'myFile.txt'"
    }
}

我得到错误“A problem occurred starting process 'command ' rm '”
注意:我不想使用task something(type: Delete),也不想使用外部脚本。它必须来自命令行。有这种可能吗?

vlurs2pr

vlurs2pr1#

Gradle为此用例提供了任务类型(Delete)和方法(delete)。
注意:我不想使用task something(type: Delete)
为什么?如果您不想使用Gradle功能,那就不要使用Gradle。
它必须来自命令行。
正如其他人所提到的,rm命令在Windows系统上不可用。这也是Gradle将此功能抽象化的原因之一。
你的代码还有一个问题:您定义了一个完全无关的Gradle任务,因为它不会执行任何功能。Gradle区分了 * 配置阶段 * 和 * 执行阶段 *。任务定义task <name> { <code> }的闭包中的<code>将直接执行(在配置阶段)。只有(内部)任务操作,doFirstdoLast闭包在实际任务执行时执行(无论是从命令行还是作为任务依赖项)。
要解决这个问题,要么直接使用Delete类型的任务(无论如何都应该这样做),要么使用Exec类型的任务,或者将exec方法 Package 在doFirst/doLast闭包中:

task remove(type: Delete) {
    delete 'myFile.txt'
}

task remove(type: Exec) {
    commandLine 'del', 'myFile.txt', '/q'
}

task remove {
    doFirst {
        exec {
            commandLine 'del', 'myFile.txt', '/q'
        }
    }
}
3gtaxfhh

3gtaxfhh2#

如果你使用的是Windows,你应该使用命令“del /q”而不是“rm”。

task remove {

   exec {

   working dir file/file2
   commandLine 'myFirstCommandLineWhichWorks'
   commandLine "del /q", "'myFile.txt'"

   }

}

正如我在评论中提到的,我建议使用Groovy来删除文件,因为从命令行执行特定于环境的命令会失去互操作性,所以当你将环境切换到Mac或Linux时,命令将不再起作用。也可以试试我从这篇文章中得到的这段代码:Groovy executing shell commands

task remove {

    def sout = new StringBuilder(), serr = new StringBuilder()
    def proc = 'del myFile.txt /q'.execute()
    proc.consumeProcessOutput(sout, serr)
    proc.waitForOrKill(1000)
    println "out> $sout err> $serr"

}

使用普通的groovy方法,它应该超级简单:

task remove { 
    String filename = "myFile.txt"  
    boolean fileSuccessfullyDeleted =  new File(filename).delete()  
    println fileSuccessfullyDeleted 
}

相关问题