Как избежать копирования и вставки в Gradle? - PullRequest
1 голос
/ 03 апреля 2020

У меня есть файл build.gradle для моего приложения весенней загрузки. У меня есть несколько деталей окружения, которые я хочу изменить для некоторых задач. Специально для задач gradle 'test', 'runSmokeTest' и 'bootRun'. Во всех задачах мне приходится делать одни и те же вызовы, поэтому я бы предпочел, если бы я мог извлечь метод из этого. Или задача. Но всякий раз, когда я делаю это, внезапно gradle больше не находит нужные мне функции.

Это вызовы, которые мне нужно сделать:

systemProperties System.properties
systemProperty "spring.cloud.config.failFast", "false"
if (project.hasProperty("TEAM_ENCRYPT_KEY"))
    environment "ENCRYPT_KEY", "$TEAM_ENCRYPT_KEY"

Код прекрасно работает, когда включен непосредственно в задача bootRun, задача test и задача runSmokeTest с помощью copy'n'paste. Я бы предпочел не дублировать код. Я попробовал следующий подход, чтобы извлечь их из задачи bootRun, но Gradle продолжает жаловаться, что он не находит функции systemProperty и environment. Аналогичным образом, если я использую встроенную функцию Intellij «метод извлечения»:

task specialConfiguration() {
    systemProperties System.properties
    systemProperty "spring.cloud.config.failFast", "false"
    if (project.hasProperty("TEAM_ENCRYPT_KEY"))
        environment "ENCRYPT_KEY", "$TEAM_ENCRYPT_KEY"
}

bootRun {
    dependsOn 'specialConfiguration'
}

Как можно извлечь этот короткий фрагмент кода из 3 задач, чтобы избежать дублирования кода?

Ответы [ 2 ]

2 голосов
/ 03 апреля 2020

Градл продолжает жаловаться, что он не находит функции systemProperty и environment

. Это яркий пример, когда Kotlin DSL сияние. Вы бы точно знали, какие методы / свойства доступны в любой момент времени, потому что это сильно типизированный язык в отличие от Groovy.

С учетом сказанного, когда вы делаете следующее:

task specialConfiguration() {
    systemProperties System.properties
    systemProperty "spring.cloud.config.failFast", "false"
    if (project.hasProperty("TEAM_ENCRYPT_KEY"))
        environment "ENCRYPT_KEY", "$TEAM_ENCRYPT_KEY"
}

bootRun {
    dependsOn 'specialConfiguration'
}

Вы находитесь:

  1. Объявление задачи с именем specialConfiguration.
  2. Не указан тип, поэтому типом является DefaultTask .
  3. Configure * Задача 1024 * зависит от specialConfiguration

Я думаю, вы предполагаете, что dependsOn - это все равно что «конфигурировать» задачу, когда на самом деле это просто добавление зависимости к задаче. См. Добавление зависимостей к задаче .

Я предполагаю, что runSmokeTest имеет тип Test. Таким образом, задачи test, runSmokeTest и bootRun реализуют интерфейс JavaForkOptions , из которого происходят методы systemProperties(..), systemProperty(.., ..) и environment(.., ..).

С учетом вышесказанного, поскольку вы знаете три задачи, которые вы хотите настроить, и все они реализуют JavaForkOptions и некоторым образом, вы можете выполнить (Kotlin DSL):

import org.springframework.boot.gradle.tasks.run.BootRun


// Assuming this is a Test task type
tasks.register("runSmokeTest", Test::class)

// Define a new Action (configuration)
val taskConfig = Action<JavaForkOptions> {
    systemProperties(System.getProperties() as Map<String, Any>)
    systemProperty("spring.cloud.config.failFast", false)
    if (project.hasProperty("TEAM_ENCRYPT_KEY")) {
        environment("ENCRYPT_KEY", project.property("TEAM_ENCRYPT_KEY")!!)
    }
}

// Configure all three tasks
tasks.named("test", Test::class, taskConfig)
tasks.named("runSmokeTest", Test::class, taskConfig)
tasks.named("bootRun", BootRun::class, taskConfig)
1 голос
/ 03 апреля 2020

Версия Groovy ответа Франсиско Матео, на случай, если это кому-нибудь понадобится.:

Closure<JavaForkOptions> configAction = {
systemProperties System.properties
    systemProperty "spring.cloud.config.failFast", "false"
    if (project.hasProperty("MOBTECH_ENCRYPT_KEY"))
        it.environment "ENCRYPT_KEY", "$MOBTECH_ENCRYPT_KEY"
}

# Configure the tasks with it
bootRun (configAction)
...