У меня есть файл шаблона конфигурации, который должен заполнять заполнители на основе текущего варианта сборки (devDebug
, prodRelease
, et c.).
Я решил создать и внедрить пользовательскую задачу Gradle в поток сборки, который правильно запускается и создает правильный файл конфигурации в папку основных ресурсов (main/res/raw
).
Моя цель - вывести сгенерированный файл конфигурации в сгенерированные ресурсы папки сборки. Например, $buildDir/generated/res/myconfig/dev/debug/raw/config.json
. Я могу установить путь для вывода, чтобы он был похож, и файл был создан, но я застрял при попытке доступа к нему из кода. Также AS не распознает папку myconfig
как ресурсы root (даже если она явно помечена). Что мне здесь не хватает?
Вот задача Gradle, выполняющая работу (это Kotlin):
fun configureMyConfiguration(variant: ApplicationVariant) {
getTasksByName(
"generate${variant.name.capitalize()}Resources",
true
).onEach { task ->
task.dependsOn(
task("${variant.name}ConfigureMyConfiguration") {
group = "MyApp"
description = "Configure my configuration"
doLast {
val configRoot = File("$buildDir/generated/myconfig/${variant.flavorName}/${variant.buildType.name}/res")
val templateFile = "$rootDir/app/config_template.json"
val configFile = File(configRoot, "raw/my_config.json")
val config = File(templateFile).readText()
.replace("\${foo}", "bar")
configFile.ensureParentDirsCreated()
configFile.createNewFile()
configFile.writeText(config)
project.android.sourceSets.getByName(variant.name) {
resources.srcDir(configRoot)
}
}
}
)
}
}
Метод настройки задач вызывается при настройке вариантов приложения:
applicationVariants.all {
outputs.forEach {
configureMyConfiguration(this@all)
}
}
Как видите, папки и файлы успешно создаются в папке сборки:
![generated resources](https://i.stack.imgur.com/VEDZM.png)
Однако ссылки из кода не работают, я предположим, потому что сгенерированные источники не распознаются и собраны должным образом.
![enter image description here](https://i.stack.imgur.com/4l9FS.png)
Я попытался добавить сгенерированную папку к исходным наборам в блоке android
файла Gradle - таким образом папка была помечена как ресурс root, но ссылки из кода все еще не работают.