Использование переменных в 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"
}
и, конечно, вы можете объединить их.