Использование ProjectDelegate `gradle` в DSL` plugins` - PullRequest
0 голосов
/ 29 мая 2020

Как указано ниже, это:

plugins {
   if (gradle.gradleVersion < "6.0")
      id("ru.vyarus.quality").version("4.3.0")
}

возвращает:

Неразрешенная ссылка: gradle

gradle также помечается как ошибка , и, наведя указатель мыши выше, я получаю:

'val Build_gradle.gradle: Gradle' не может быть вызван в этом контексте неявным получателем. При необходимости используйте явный

Погуглил, я попытался указать получателя:

plugins {
   if (this@Build_gradle.gradle.gradleVersion < "6.0")
      id("ru.vyarus.quality").version("4.3.0")
}

Но срабатывает:

Неразрешенная ссылка: getGradle

Есть способ? (кроме объявления внешней переменной только для этого)

1 Ответ

1 голос
/ 31 мая 2020

From Ограничения плагинов DSL :

Это требует, чтобы плагины были указаны таким образом, чтобы Gradle мог легко и быстро извлечь их, перед выполнением остальной части скрипта сборки . Это также требует, чтобы определение используемых подключаемых модулей было несколько статичным c.

Блок plugins {} не поддерживает произвольный код. Он ограничен, чтобы быть идемпотентным (давать один и тот же результат каждый раз) и не иметь побочных эффектов (безопасно для Gradle для выполнения в любое время).

Фактически, ваш сценарий сборки оценивается по CompiledKotlinPluginsBlock для блока plugins и CompiledKotlinBuildScript для остальных. Итак, this@Build_gradle не всегда относится к одному и тому же объекту. Вы можете увидеть это, напечатав суперкласс в разных местах:

println(this@Build_gradle::class.java.superclass)

И, как оказалось, CompiledKotlinPluginsBlock не имеет метода getGradle().

Замечательно знать, почему такое бывает, но найти решение было не так просто. Вы не можете добавить переменную за пределами plugins {}, потому что она недостижима. Один из способов - иметь поле stati c в папке buildSrc, но было бы странно нуждаться в нем только для этого.

Вот кое-что, что я обнаружил, что работает. В вашем root build.gradle.kts добавьте:

plugins {
    id("ru.vyarus.quality") version "4.3.0" apply false
}

project(":yourModule") {
    if (gradle.gradleVersion < "6.0") {
        apply(plugin = "ru.vyarus.qualit")
    }
}

I wi sh старый способ apply(plugin = не нужен, но это единственное решение, которое я нашел. Вам не нужно ничего особенного в вашем модуле plugins {}.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...