Я экспериментирую с gradle и пытаюсь настроить систему, которая создает разные варианты (бренды) приложения, которые в основном различаются конфигурацией. Пока у меня есть две версии скриптов сборки - обе не работают.
Версия 1
Папка ресурсов первого варианта flavor-res
добавляется к sourcesets
, что приводит к перезаписи некоторых ресурсов по умолчанию. Правило задачи определяет задачи для каждого варианта, которые должны (в идеале) инициировать сборку всей банки.
Это отлично работает и создает требуемую банку для одного аромата за раз, например
gradle clean flavorOne
но задача shadowJar
запускается только один раз, если я это сделаю
gradle clean flavorOne flavorTwo
Урезанный скрипт:
sourceSets {
main {
...
resources {
srcDirs = ['src/main/resources', "${project.buildDir}/flavor-res/"]
}
}
}
shadowJar { classifier = 'SNAPSHOT' }
tasks.addRule("Pattern: flavor<Name>") { String taskName ->
if (taskName.startsWith("flavor")) {
String flavorName = (taskName - "flavor")
String flavorOutDir = "${project.buildDir}/${flavorName}"
// Set output folder and jar name
task("${taskName}Configure") {
outputs.dir(flavorOutDir)
doFirst {
archivesBaseName = flavorName
project.buildDir = flavorOutDir
}
}
// Copy res to folder used in sourcesets
task("${taskName}CopyResources") {
mustRunAfter = ["${taskName}Configure"]
outputs.dir("${project.buildDir}/flavor-res")
doFirst {
copy {
from "flavors/${flavorName}/"
into "${project.buildDir}/flavor-res/"
}
}
}
shadowJar.mustRunAfter = ["${taskName}Configure", "${taskName}CopyResources"]
// Define task that depends on shadowJar
task(taskName, dependsOn: ["${taskName}Configure", "${taskName}CopyResources",
shadowJar]) {
println "Configuring ${taskName}"
}
}
Чувствуя, что это, вероятно, не работает, потому что обнаружение изменений почему-то не работает, я попробовал альтернативный подход. Вот упрощенная версия скрипта
Версия 2
Изменено правило, чтобы определить shadowJar
динамическую задачу для каждого варианта.
/* Removed sourceSets in this version */
shadowJar { classifier = 'SNAPSHOT' }
tasks.addRule("Pattern: flavor<Name>") { String taskName ->
if (taskName.startsWith("flavor")) {
String flavorName = (taskName - "flavor")
String flavorOutDir = "${project.buildDir}/${flavorName}"
// Set resources for main sourceset
task("${taskName}Configure") {
outputs.dir(flavorOutDir)
doFirst {
archivesBaseName = flavorName
sourceSets.main.resources.srcDirs = ['src/main/resources', "${flavorOutDir}/flavor-res"]
project.buildDir = flavorOutDir
}
}
task("${taskName}CopyResources") {
outputs.dir("${flavorOutDir}/flavor-res")
dependsOn "${taskName}Configure"
doFirst {
copy {
from "flavors/${flavorName}/"
into "${project.buildDir}/flavor-res/"
}
}
}
// This should shadowJar for each flavor - but generate jars dont have the required artifacts.
task ("${taskName}Build", type: ShadowJar) {
from sourceSets.main.output
configurations = [ configurations.runtime ]
classifier = 'SNAPSHOT'
dependsOn "${taskName}CopyResources"
}
task(taskName, dependsOn: ["${taskName}Build"]) {
}
}
}
Однако теперь сгенерированные банки имеют неверный формат. Первый аромат получает только артефакты для основного, но не показывает баночки. Во второй банке есть только манифест и ничего больше.
Каким будет правильный способ достижения этого.
PS: Нет, это не приложение для Android (вкус — это просто синоним бренда).