首页 > 解决方案 > Kotlin 上 Gradle 脚本中的命令行问题

问题描述

我正在 Gradle 中编写任务以使用我的 Docker 容器。其中一个将杀死并移除 2 个容器。Linux中的常用命令看起来像

docker-compose -f docker-compose.yml kill postgresql redis wap-pattern && docker-compose -f docker-compose.yml rm -f wap-pattern postgresql redis

它工作正常,但在 Kotlin 中我必须使用参数列表,所以在我的代码中它看起来像

tasks.register<Exec>("downAll") {
    group = "docker"
    commandLine = listOf("docker-compose", "-f", "docker-compose.yml", "kill", "postgresql", "redis", "&&", "docker-compose", "-f", "docker-compose.yml", "rm", "-f", "postgresql", "redis")
}

不幸的是,它根本不起作用,并以错误代码退出。显然 Kotlin 没有正确解析&&

那么,我该如何处理这个问题并使我的任务有效呢?我可以在同一个任务主体中以某种方式避免 & 并调用命令行执行 2 次吗?

标签: gradlekotlin

解决方案


您不能使用&&,但可以使用第二种方式在 gradle 上声明任务类型。

tasks.register("downAll") {
    group = "docker"
    doLast {
        exec {
            commandLine = listOf("docker-compose", "-f", "docker-compose.yml", "rm", "-f", "postgresql", "redis")
        }
    }
    doLast {
        exec {
            commandLine = listOf("docker-compose", "-f", "docker-compose.yml", "kill", "postgresql", "redis")
       }
    }
}

如果您只想多次重复相同的命令行,我建议您使用 kotlin 的重复功能

tasks.register("downAll") {
   doLast {
       repeat(2) {
            exec {
                commandLine = listOf("docker-compose", "-f", "docker-compose.yml", "kill", "postgresql", "redis")
            }
        }
    }
}

推荐阅读