Использование переменных в Gradle build script

Я использую Gradle в своем проекте. У меня есть задача сделать некоторую дополнительную настройку с моей войной. Мне нужно построить строку для использования в моей задаче вроде, скажем, у меня есть:

task extraStuff{
    doStuff 'org.springframework:spring-web:[email protected]'
}

Это прекрасно работает. Мне нужно определить версию (фактически уже определенную в файле свойств) и использовать ее в задаче типа:

springVersion=3.0.6.RELEASE

task extraStuff{
    doStuff 'org.springframework:spring-web:${springVersion}@war'
}

Моя проблема: spring версия не распознается как переменная. Итак, как я могу передать его внутри строки?

Ответ 1

Я думаю, что проблема может заключаться в строковых литералах:

  • Строковые литералы определяются точно так же, как и в groovy, поэтому заключите его в одиночные или двойные кавычки (например, "3.0.6.RELEASE");
  • Gstrings не анализируются в строках одинарных кавычек (как одиночные '...', так и тройные '''...'''), если я правильно помню;

Таким образом, код будет выглядеть следующим образом:

springVersion = '3.0.6.RELEASE' //or with double quotes "..."

task extraStuff{
    doStuff "org.springframework:spring-web:${springVersion}@war"
}

Ответ 2

Если вы разрабатываете приложение Android с использованием Gradle, для объявления переменной (т.е. для версии с некоторыми зависимостями) необходимо использовать ключевое слово def, например ниже:

def version = '1.2'

dependencies {
  compile "groupId:artifactId:${version}"
}

Надеюсь, это помогло!

Ответ 3

На андроиде есть на самом деле 2 возможности как этого добиться. Это действительно зависит от того, что соответствует вашим потребностям. Эти две возможности имеют свои плюсы и минусы. Вы можете использовать переменную def или блок ext{}. Переменная def является удивительной, потому что она позволяет вам щелкнуть по переменной и указать точно, где она определена в файле, по сравнению с блоком ext{}, который НЕ указывает на эту точную переменную. С другой стороны, у ext{} есть одно хорошее преимущество: вы можете ссылаться на переменные от project_name/build.gradle до project_name/app/build.gradle, что в некоторых случаях очень полезно, НО, как я уже сказал, если вы нажимаете на эту переменную, скажем, только внутри одного файла он не будет указывать на определение этой переменной, что очень плохо, потому что это займет у вас больше времени поиска, если ваш список зависимостей растет.

1) Опция def, которая является наилучшей и экономит ваше время поиска.

def lifecycle = '2.0.0'

dependencies {
    implementation 'androidx.lifecycle:lifecycle-extensions:$lifecycle'
}

2) второй блок ext {}. Это нормально, если список зависимостей не велик.

ext {
    lifecycle = '1.1.1'
}

dependencies {
    implementation 'androidx.lifecycle:lifecycle-extensions:$lifecycle'
}

3) В некоторых случаях, если вы хотите обмениваться переменными между project_name/build.gradle и project_name/app/build.gradle , используйте ext {}

в project_name/build.gradle вы определяете kotlin_shared_variable:

buildscript {
    ext.kotlin_shared_variable = '1.3.41'

    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_shared_variable"
    }
}

который вы можете использовать в project_name/app/build.gradle

dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_shared_variable"
}

и, конечно, вы можете объединить их.