您如何在 gradle 个任务之间共享代码?
How do you share code between gradle tasks?
所以我有一些 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 {
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}"
}
但是失败了
Execution failed for task ':startGlassfish'.
> execCommand == null!
所以我显然误会了什么。
如何让它工作?
编写自定义任务时类我建议首先检查原始任务的代码。 exec任务的@TaskAction是exec()方法可以看出in AbstractExecTask class
您可以使用以下代码;
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}"]
}
所以我有一些 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 {
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}"
}
但是失败了
Execution failed for task ':startGlassfish'.
> execCommand == null!
所以我显然误会了什么。
如何让它工作?
编写自定义任务时类我建议首先检查原始任务的代码。 exec任务的@TaskAction是exec()方法可以看出in AbstractExecTask class
您可以使用以下代码;
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}"]
}