Как вы разделяете код между задачами Gradle? - PullRequest
0 голосов
/ 02 марта 2019

Итак, у меня есть несколько простых задач для взаимодействия со стеклянными рыбками ...

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!

Так что я явно что-то неправильно понимаю.

Как мне заставить это работать?

1 Ответ

0 голосов
/ 02 марта 2019

При написании пользовательских классов задач сначала рекомендуется проверить исходный код задачи.@TaskAction задачи Exec - это метод exec (), который можно увидеть в классе AbstractExecTask

Вы можете использовать следующий код:

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}"]
}
...