Создать вторую задачу installDist? - PullRequest
1 голос
/ 09 апреля 2020

Во время разработки я использую стандартную функцию installDist (из плагина application) в build.gradle:

installDist{}

... но теперь я хочу иметь другую задачу, которая устанавливает / распространяет / развертывает «производственную» версию в производственную папку, которая также включает версию в структуру каталога. Я пробовал это:

task deployOperativeVersion( type: installDist ) {
    destinationDir = file( "$productionDir/$version" )
}

Вывод сбоя сборки:

Build file '/home/mike/IdeaProjects/JavaFXExp2/Organiser/build.gradle' line: 98

* What went wrong:
A problem occurred evaluating root project 'Organiser'.
> class org.gradle.api.tasks.Sync_Decorated cannot be cast to class java.lang.Class 
    (org.gradle.api.tasks.Sync_Decorated is in unnamed module of loader org.gradle.
    internal.classloader.VisitableURLClassLoader @aec6354; java.lang.Class is in module
    java.base of loader 'bootstrap')

Похоже, что installDist не является "типом", как в Test.

Как мне этого добиться? Кстати, мне бы очень хотелось иметь две отдельные задачи: чтобы запустить installDist, я обнаружил, что вам нужно всего лишь набрать ./gradlew inst ... с задачей под названием deployXXX, достаточно было бы набрать ./gradlew depl.

Я также попробовал это:

task deployOperativeVersion{
    installDist{
        destinationDir = file( "$operativeDir/$version" )
    }
}

... который, кажется, ничего не сделал. И не так:

task deployOperativeVersion{
    doFirst {
        installDist {
            destinationDir = file("$operativeDir/$version")
        }
    }
}

Чуть позже я подумал, что действительно нашел ответ:

task deployOperativeVersion{
    dependsOn installDist{ destinationDir=file("$productionDir/$version")
}

... но к моему изумлению (смогу ли я когда-нибудь прийти к разумному пониманию Gradle до того, как ад замерзнет?), В том числе это фактически влияет на «рутинную» задачу installDist: в частности, она мешает последней нормально работать и означает, что даже когда я запускаю installDist, развертывание / распространение / установка все еще идет к productionDir/version, а не к местоположению по умолчанию.

Итак, я подумал о двух задачах, каждая из которых зависит от installDist:

task deployOperativeVersion{
    dependsOn installDist{ destinationDir=file("$productionDir/$version") }
}

task stdInstall{
    dependsOn installDist{ destinationDir=file("build/install") }
}

... хаха, нет радость: я бегу один, и он развертывает ОК. Затем я запускаю другой ... и получаю сообщение об ошибке:

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':installDist'.
> The specified installation directory '/home/mike/IdeaProjects/JavaFXExp2/Organiser/build/install' is neither empty nor does it contain an installation for 'Organiser'.
  If you really want to install to this directory, delete it and run the install task again.
  Alternatively, choose a different installation directory.

... само собой разумеется, это НЕ тот случай: под ... Организатор / сборка / установка есть только один каталог, Органайзер с каталогами / bin и / lib.

1 Ответ

1 голос
/ 13 апреля 2020

Ваша задача должна быть объявлена ​​как задача Sync, которая является фактическим типом задачи installDist. Плагин application использует плагин distribution. Вы можете получить конфигурацию контента из дистрибутива main, который является источником, или из задачи installDist.

task deployOperativeVersion(type: Sync) {
    destinationDir = file("${productionDir}/${version}")
    with distributions.main.content
}

или

task deployOperativeVersion(type: Sync) {
    destinationDir = file("${productionDir}/${version}")
    with installDist
}
...