Пользовательская активная задача, связанная с ароматом, включенная в процесс сборки
В среде сборки Android Gradle:
В настоящее время я читаю мой Код версии и Имя версии из локального файла version.properties с помощью задачи gradle "readVersions". Я нахожусь в процессе добавления ароматов в мое приложение. Эти ароматы потребуются разные версии. Поэтому я думал о том, чтобы поместить два разных файла version.properties в каталоги, специфичные для аромата (например, один / version.properties, two / version.properties), рядом с каталогами res и src, специфичными для аромата.
У меня есть задача readVersions:
task readVersions() {
def Properties versionProps = new Properties()
def versionPropsFile = file('version.properties')
if (versionPropsFile.exists())
versionProps.load(new FileInputStream(versionPropsFile))
def v_code = (versionProps['VERSION_CODE'] ?: "0").toInteger()
def v_name = versionProps['VERSION_NAME']
// Set
versionCode v_code
versionName v_name
}
project.afterEvaluate {
preBuild.dependsOn readVersions
}
Я хотел бы иметь новую задачу readVersions, которая включает аромат, чтобы я мог использовать его при доступе к файлу "version.properties" в каталоге "flavor".
Я пытался:
android.productFlavors.all{ flavor ->
task ("${flavor.name}_readVersions")<<{
def versionPropsFile = file(flavor.name+'/version.properties')
...
Но тогда я не знаю, как заставить только задачу активного аромата запускаться во время шага "preBuild".
Концептуально я хочу это:
project.afterEvaluate {
preBuild.dependsOn ${active_flavor}_readVersions
}
Тем, кто рекомендует реорганизацию и поиск более простых решений. Мой процесс сборки в настоящее время имеет другие зависимости от этих файлов version.properties. Я мог бы просто определить код версии и название версии в двух местах (например, внутри "flavour", а также в файле "version.properties" ароматизатора, но мне действительно нужны DRY-конфигурации)
1 ответ
Я разделил мою задачу "readVersions" на "readVersionName" и "readVersionCode"
def getVersionName(flavor) {
return getVersion(flavor, "VERSION_NAME", false)
}
def getVersionCode(flavor) {
return getVersion(flavor, "VERSION_CODE", true)
}
def getVersion(flavor, type, intRequired) {
// READ
def Properties versionProps = new Properties()
def versionPropsFile = file("${flavor}/version.properties")
if (versionPropsFile.exists())
versionProps.load(new FileInputStream(versionPropsFile))
def value = versionProps["${type}"]
return intRequired ? value.toInteger() : value
}
Затем я запускаю их внутри определения каждого аромата:
productFlavors {
one {
versionName getVersionName("one")
versionCode getVersionCode("one")
}
two {
versionName getVersionName("two")
versionCode getVersionCode("two")
}
Стоит отметить, что моя предыдущая попытка заключалась в том, чтобы включить параметры versionName и versionCode в зависимости от задачи preBuild. Похоже, что к этому времени "versionName" больше не может быть правильно установлен. В моих задачах не было правильной настройки, поэтому я и придумал другое решение, но после его прочтения он всегда был "нулевым".
Спасибо CommonsWare за комментарии и предложения.