#gradle
#gradle
Вопрос:
Я использую gradle.properties
и local.properties
для ввода конфигурации buildSrc
.
// in buildSrc
private val localVersions = LocalVersions.create()
object Versions {
kotlin = localVersions.kotlin
}
object Libs {
kotlin = "org.jetbrains.kotlin:kotlin-stdlib-jdk7:${Versions.kotlin}"
}
// gradle.properties
versions.kotlin=1.3.21
Это отлично работает. Но, допустим, я добавляю эту строку в local.propeties
(которая должна переопределять значение в gradle.properties
).
// local properties
versions.kotlin=1.3.30
Когда я снова создаю, Versions.kotlin
все равно возвращается 1.3.21
, потому что он не понимает, что изменение local.properties
повлияет на путь к классу buildSrc.
private data class LocalVersions(
val kotlin: String
) {
companion object {
private const val gradlePropertiesFileName = "gradle.properties"
private const val localPropertiesFileName = "local.properties"
private const val kotlinVersionPropertyName = "versions.kotlin"
@JvmStatic
fun create(): LocalVersions {
val props = Properties().apply {
fun File.asInputStream(): InputStream = BufferedInputStream(FileInputStream(this))
val gradlePropsFile = File(gradlePropertiesFileName).apply {
require(exists()) {
"File does not exist. ${this.absolutePath}"
}
}
val localPropsFile = File(localPropertiesFileName)
if (!gradlePropsFile.exists()) {
throw FileNotFoundException("Could not find file: $gradlePropsFile.absolutePath")
}
load(gradlePropsFile.asInputStream())
if (localPropsFile.exists()) {
load(localPropsFile.asInputStream())
}
}
fun findProperty(name: String): String {
return props.getProperty(name)
?: throw IllegalStateException("Could not find property `$this` in `gradle.properties` or `local.properties`.")
}
return LocalVersions(
kotlin = findProperty(kotlinVersionPropertyName)
)
}
}
}
Если я внесу изменение в значение gradle.properties
, Gradle поймет, что buildSrc
оно было изменено. Если я внесу аналогичное изменение local.properties
, Gradle не поймет, что синхронизация необходима. Как я могу поручить Gradle реализовать это?