我正在编写一个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以确定哪种方法是它的工作方法然后直接调用它?或者是否有更通用的方法来实现我的目标?
答案 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}")
}
}