У меня есть модули gradle: приложение и модуль библиотеки libApp. У каждого из них есть собственный файл gradle. app.gradle:
productFlavors {
prod {somevariable = false}
debug {somevariable = true}
}
dependencies {
implementation project(':libApp')
}
И libApp.gradle:
defaultConfig {
buildConfigField "boolean", "SOME_VARIABLE_FROM_APP_MODULE", somevariable
}
Как заставить Gradle скомпилировать проект libApp в модуле приложения с некоторой переменной, зависящей от вкуса продукта?
Вы можете создать блок ext на уровне вашего проекта build.gradle, который инкапсулирует пользовательские свойства и делает их доступными для всех модулей в проекте.
ext {
somevariable = true
}
При доступе к нему вы можете просто
defaultConfig {
buildConfigField "boolean", "SOME_VARIABLE_FROM_APP_MODULE", ext.somevariable
}
Вы можете установить переменную для каждого варианта, как показано здесь
@taulus просто обновляет значение для каждого вкуса, и это должно помочь
@Sagar, но это не так: / Он ведет себя так, как будто libApp скомпилирован один раз с некоторым значением переменной, как в отладке, - даже если я создаю продукт.
Вы можете сделать это с ароматизаторами.
В модуле библиотеки build.gradle определите измерение аромата, соответствующее значению переменной:
android {
/* ... */
flavorDimensions "someVar"
productFlavors {
someVarTrue {
dimension "someVar"
buildConfigField "boolean", "SOME_VARIABLE_FROM_APP_MODULE", 'true'
}
someVarFalse {
dimension "someVar"
buildConfigField "boolean", "SOME_VARIABLE_FROM_APP_MODULE", 'false'
}
}
}
В build.gradle модуля приложения определите, какой вариант приложения должен использовать какой вариант библиотеки:
android {
/* ... */
flavorDimensions "environment"
productFlavors {
prod {
dimension "environment"
}
dev {
dimension "environment"
} // note: naming a flavor "debug" might create a conflict with the default "debug" configuration
}
}
dependencies {
/* ... */
prodImplementation project(path: ':libApp', configuration: 'someVarTrue')
devImplementation project(path: ':libApp', configuration: 'someVarFalse')
}
Возможно, вы захотите увидеть эта статья для получения более подробной информации.
Это не сработает, потому что вы ошиблись конфигурацией с названием аромата. someVarTrue должен быть объявлен в блоке configurations {} библиотеки, но внутри него мы не можем объявить buildConfigFields. Вы уверены, что приведенный выше код правильный?
@taulus Я обновил свой ответ, теперь он должен работать. Извините, я выкладывал это по памяти на смартфон и испортил синтаксис. ;)
Это будет работать, НО я хочу изменить значение некоторой переменной в зависимости от созданного в настоящее время аромата.