Inheritance 如何在gradle任务之间共享代码?
所以我有一些gradle任务要和glassfish互动Inheritance 如何在gradle任务之间共享代码?,inheritance,gradle,groovy,build.gradle,gradle-task,Inheritance,Gradle,Groovy,Build.gradle,Gradle Task,所以我有一些gradle任务要和glassfish互动 task startGlassfish(type:Exec){ workingDir "${glassfishHome}${File.separator}bin" if (System.properties['os.name'].toLowerCase().contains('windows')) { commandLine 'cmd', '/c', 'asadmin.bat' } else {
task startGlassfish(type:Exec){
workingDir "${glassfishHome}${File.separator}bin"
if (System.properties['os.name'].toLowerCase().contains('windows')) {
commandLine 'cmd', '/c', 'asadmin.bat'
} else {
commandLine "./asadmin"
}
args "start-domain", "${glassfishDomain}"
}
task stopGlassfish(type:Exec){
workingDir "${glassfishHome}${File.separator}bin"
if (System.properties['os.name'].toLowerCase().contains('windows')) {
commandLine 'cmd', '/c', 'asadmin.bat'
} else {
commandLine "./asadmin"
}
args "stop-domain", "${glassfishDomain}"
}
task deploy(dependsOn: 'war', type:Exec) {
workingDir "${glassfishHome}${File.separator}bin"
if (System.properties['os.name'].toLowerCase().contains('windows')) {
commandLine 'cmd', '/c', 'asadmin.bat'
} else {
commandLine "./asadmin"
}
args "deploy", "--force=true", "${war.archivePath}"
}
这是很多不必要的代码重复,我想把它重构成更精简的东西
我确实试过了
class GlassfishAsadminTask extends Exec{
@TaskAction
def run() {
workingDir "${glassfishHome}${File.separator}bin"
if (System.properties['os.name'].toLowerCase().contains('windows')) {
commandLine 'cmd', '/c', 'asadmin.bat'
} else {
commandLine "./asadmin"
}
}
}
task startGlassfish(type:GlassfishAsadminTask){
args "start-domain", "${glassfishDomain}"
}
但这对我们来说是失败的
任务“:startGlassfish”的执行失败
>execCommand==null
所以我显然误解了什么
如何实现这一点?在编写自定义任务类时,我建议首先检查原始任务的代码。可以看到,Exec task的@TaskAction是Exec()方法 您可以使用以下代码
class GlassfishAsadminTask extends Exec{
// arguments that tasks will pass (defined as array)
@Input
String[] cmdArguments
@TaskAction
public void exec() {
// access properties with project.proppertyName
workingDir "${project.glassfishHome}${File.separator}bin"
if (System.properties['os.name'].toLowerCase().contains('windows')) {
commandLine 'cmd', '/c', 'asadmin.bat'
} else {
commandLine "./asadmin"
}
// set args that is set by the task
args cmdArguments
super.exec()
}
}
// A sample task
task startGlassfish(type: GlassfishAsadminTask) {
cmdArguments = ["start-domain", "${glassfishDomain}"]
}
有趣的。。。如果我这样尝试,我会得到任务的
执行失败:startGlassfish'>无法为任务获取未知属性“glassfishHome”:类型为GlassfishAsadminTask的startGlassfish。
(是的,这些属性位于gradle.properties
中,并且问题帖子中带有重复代码的版本确实有效。)@User1291您需要访问类似project.glassfishHome的属性。我更新了答案