【问题标题】:How to remove file using a task gradle如何使用任务 gradle 删除文件
【发布时间】:2023-03-09 17:56:01
【问题描述】:

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

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

我收到错误“启动进程'command 'rm'时出现问题”

注意:我不想使用task something(type: Delete),也不想使用外部脚本。 它必须来自命令行。 有可能吗?

【问题讨论】:

  • 你会碰巧在 Windows 上吗?
  • 是的,我有窗户
  • Windows 不支持rm - 如果您从 mingw 或类似的工具运行它,但您无权访问 UNIX 工具。您需要使用特定于 Windows 的命令,但出于可移植性考虑,我强烈建议您使用 Groovy 的内置函数。
  • 你试过file('myFile.txt').delete()吗?
  • @cfrick "它必须来自命令行"

标签: android gradle groovy terminal


【解决方案1】:

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

Gradle 为这个用例提供了一个任务类型 (Delete) 和一个方法 (delete)。

注意:我不想使用task something(type: Delete)

为什么?如果您不想使用 Gradle 功能,请不要使用 Gradle。

它必须来自命令行。

正如其他人所提到的,rm 命令在 Windows 系统上不可用。这是 Gradle 抽象此功能的原因之一。


您的代码还有另一个问题:您定义了一个完全不相关的 Gradle 任务,因为它不会执行任何功能。 Gradle 区分了配置阶段执行阶段。任务定义task <name> { <code> } 闭包内的<code> 将直接执行(在配置阶段)。只有(内部)任务操作,doFirstdoLast 闭包在执行实际任务时(从命令行或作为任务依赖项)执行。

要解决这个问题,要么直接使用Delete 类型的任务(无论如何你都应该这样做),使用Exec 类型的任务或将exec 方法包装在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'
        }
    }
}

【讨论】:

    【解决方案2】:

    如果您使用的是 Windows,则应使用命令“del /q”而不是“rm”

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

    正如我在 cmets 中提到的,我建议使用 Groovy 来删除文件,因为从命令行执行特定于环境的命令会失去互操作性,因此当您将环境切换到 Mac 或 Linux 时,该命令将不再起作用.也可以尝试使用我从这篇 SO 帖子中获得的这段代码: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 
    }
    

    【讨论】:

    • 它不起作用,我得到“启动进程'command 'del /q出现问题”
    • 为什么不能直接使用 Groovy 来删除文件?为什么必须是命令行?
    • 可能必须是"del", "/q", "'myFile.txt'"
    • @Zoe 我的意思是直接从 groovy 代码中使用命令行,我们失去了所有的互操作性,因此当您在 Linux 或 Mac 上执行此 Windows 代码时,它将不再工作。使用普通的 Groovy,它应该可以在所有环境中工作
    • 所以通过参数传递filePath
    猜你喜欢
    • 1970-01-01
    • 2015-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多