在gradle中重用Exec任务以进行常见命令行操作的最合适方法是什么?

Jos*_*non 11 plugins gradle

我正在编写一个gradle构建文件,它将为我们的产品安装一个基本的开发域.基本上所有真正的代码都将在自定义插件和自定义任务中.涉及的几个步骤相当重复(多个sudo调用,多个用户添加),我想将常见的东西封装到一个任务中.

例如:

task('addDBUser', type:AddUser) {
    username = joeUser
}

task('startService', type:SudoExec) {
    workingDir = "not/too/relevant"
    commandLine = "/etc/init.d/coolService start"
}
Run Code Online (Sandbox Code Playgroud)

我想尽可能地重用Exec给我的各种功能(stdin,stdout等),同时自动提供样板("sudo ...").我很确定我可以扩展Exec而不是DefaultTask,但我不知道触发实际操作的标准方法.用我需要的东西修改commandLine属性似乎很容易,但是当我想要Exec实际去的时候,没有通用的"run()"等.

我是否打开Exec以确定哪种方法是它的工作方法然后直接调用它?或者是否有更通用的方法来实现我的目标?

erd*_*rdi 13

要查看为任务执行的方法,您可以检查源代码Exec并搜索标记为的方法@TaskAction.事实证明这是exec()方法,但通常你不想手动调用任务操作,但让Gradle为你做.我认为最好的想法是为您的自定义任务添加方法/设置器.它可能看起来像这样:

task addUser(type: AddUser) {
    username = 'fromGradle'
}


class SudoExec extends Exec {

    void sudoCommand(Object... arguments) {
        executable 'sudo'
        args = arguments.toList()
    }
}

class AddUser extends SudoExec {

    void setUsername(String username) {
        sudoCommand('useradd', username)
    }
}
Run Code Online (Sandbox Code Playgroud)