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

时间:2013-04-19 15:23: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"
}

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

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

2 个答案:

答案 0 :(得分: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)
    }
}

答案 1 :(得分:1)

此代码能够处理多个参数,因为它不会挂钩到任何特定参数的setter,而是使用惰性GString评估。

task vagrantfile (type:Vagrantfile) {
    account 'vagrant'
    password 'vagrant'
}

class Vagrantfile extends Copy {
    String account
    String password

    def Vagrantfile() {
        from 'templates/'
        into 'build/'
        include 'Vagrantfile.ubuntu.tpl'
        rename {'Vagrantfile'}
        expand (account:"${->account}", password:"${->password}")
    }
}