J'ai les deux types de construction par défaut: debug/release et quelques variantes: prod/dev.
Maintenant, je veux exclure la variante de construction dev-release, mais je garde toutes les autres combinaisons possibles. Y a-t-il un moyen d'y parvenir?
Utilisez le variantFilter du plugin Android gradle pour marquer certaines combinaisons comme ignorées. Voici un exemple tiré de documentation officielle qui fonctionne avec les dimensions de saveur et montre comment il peut être utilisé:
Android {
...
buildTypes {...}
flavorDimensions "api", "mode"
productFlavors {
demo {...}
full {...}
minApi24 {...}
minApi23 {...}
minApi21 {...}
}
variantFilter { variant ->
def names = variant.flavors*.name
// To check for a certain build type, use variant.buildType.name == "<buildType>"
if (names.contains("minApi21") && names.contains("demo")) {
// Gradle ignores any variants that satisfy the conditions above.
setIgnore(true)
}
}
}
Comme le dit le commentaire, vous pouvez également vérifier le type de construction de la manière suivante:
Android {
variantFilter { variant ->
def names = variant.flavors*.name
if(variant.buildType.name == 'release' && names.contains("myforbiddenflavor")) {
setIgnore(true)
}
}
}
Lorsque vous travaillez avec des dimensions de goût, essayez celui-ci.
variantFilter { variant ->
def dim = variant.flavors.collectEntries {
[(it.productFlavor.dimension): it.productFlavor.name]
}
if (dim.dimensionOne == 'paid' && dim.dimensionSecond == 'someVal') {
variant.setIgnore(true);
}
}
Si vous utilisez Dimensions de la saveur faites ceci:
flavorDimensions "device", "server"
productFlavors {
emulator {
dimension = "device"
}
phone {
dimension = "device"
}
staging {
dimension = "server"
}
production {
dimension = "server"
}
}
Android.variantFilter { variant ->
def device = variant.getFlavors().get(0).name
def server = variant.getFlavors().get(1).name
def isRelease = variant.buildType.name.equals('release')
def isDebug = variant.buildType.name.equals('debug')
// Disable emulatorProductionRelease build variant
if (device.equals('emulator') && server.equals('production') && isRelease) {
variant.setIgnore(true)
}
}
Il est facile à lire et vous pouvez cibler des variantes de construction spécifiques.
En utilisant des filtres de variantes comme d’autres, j’ai trouvé qu’il était plus facile de le faire en comparant le nom de la variante à une liste de variantes que je souhaite conserver.
Donc, dans mon fichier app/build.gradle
, j'ai quelque chose comme:
Android {
variantFilter { variant ->
def needed = variant.name in [
'stagingQuickDebug', // for development
'stagingFullDebug', // for debugging all configurations
'stagingFullCandidate', // for local builds before beta release
'stagingFullRelease', // for beta releases
'productionFullCandidate', // for local builds before going public
'productionFullRelease' // for public releases
]
variant.setIgnore(!needed)
}
buildTypes {
debug {
}
release {
}
candidate.initWith(release)
}
flavorDimensions "server", "build"
productFlavors {
staging {
dimension "server"
buildConfigField "String", "API_URL", '"https://example-preprod.com/"'
}
production {
dimension "server"
buildConfigField "String", "API_URL", '"https://example.com/"'
}
quick {
dimension "build"
minSdkVersion 21
resConfigs("en", "xxhdpi")
}
full {
dimension "build"
}
}
}
Les solutions ici ne fonctionnaient pas pour moi - je tombe sur ce message et ajouta ceci à build.gradle dans mon application et le problème fut résolu pour moi
gradle.taskGraph.whenReady { graph ->
graph.allTasks.findAll { it.name ==~ /.*MyVariant.*/ }*.enabled = false
}
C’est ce qu’il fait - attend que gradle assemble la liste complète des tâches à exécuter, puis marque toutes les tâches correspondant au modèle de nom comme étant désactivées.
NOTE La correspondance est exacte - l'expression ci-dessus vous permet de faire correspondre toute tâche ayant "MyVariant" quelque part dans son nom et qui respecte la casse
Voir la réponse du filtre de variante ci-dessus.
Ancienne réponse:
Ce n'est pas possible pour le moment, mais c'est quelque chose que nous voulons ajouter. Probablement bientôt.
En attendant, vous pouvez désactiver la tâche d'assemblage, je pense. Quelque chose comme ça:
Android.applicationVariants.all { variant ->
if ("devRelease".equals(variant.name)) {
variant.assembleTask.enabled = false
}
}
La réponse de @ ade.se n'a pas fonctionné pour moi. Mais j'ai un peu lutté et écrit ceci, cela fonctionne très bien:
Android {
compileSdkVersion 22
buildToolsVersion '20.0.0'
variantFilter { variant ->
if (variant.buildType.name.equals('debug') || variant.buildType.name.equals('release')) {
variant.setIgnore(true);
}
}
defaultConfig {
applicationId "com.fewlaps.quitnow"
minSdkVersion 15
targetSdkVersion 22
versionCode 35
versionName "1.35"
}
Le code que vous devez ajouter est le variantFilter one, mais j'ai un peu collé le contexte pour le rendre facile à comprendre.
Un moyen plus simple
Android.variantFilter { variant ->
if (variant.name == "qaDebug" || variant.name == "devRelease") {
setIgnore(true)
}
}
Ou si vous placez ce code dans la fermeture Android {}
, vous pouvez omettre Android.
Android {
// Please always specify the reason for such filtering
variantFilter { variant ->
if (variant.name == "qaDebug" || variant.name == "devRelease") {
setIgnore(true)
}
}
}
S'il vous plaît toujours mettez un commentaire significatif pour des choses comme celle-ci.