在不破坏变体忽略表达式的情况下应用Google服务插件

时间:2018-03-29 23:49:47

标签: android firebase android-gradle

每当您向Firebase项目添加新的Android应用程序时,系统会要求/提醒您应用GPS插件:

Plz applie plawg-in

现在,根据具有mockprod风格的this Google Samples project进行方便测试,您可以(或必须)摆脱mockRelease变种,因为......我们都知道为什么。因此,实现此变体方法并使用Firebase的构建文件如下所示:

的build.gradle

android {
    ...

    buildTypes {
        release {
            ...
        }

        debug {
            applicationIdSuffix ".debug"
            ...
        }
    }

    flavorDimensions "environment"
    productFlavors {
        mock {
            applicationIdSuffix = ".mock"
            dimension "environment"
        }
        prod {
            dimension "environment"
        }
    }

    android.variantFilter { variant ->
        if (variant.buildType.name == 'release' && variant.flavors[0].name == 'mock') {
            variant.setIgnore(true)   // These
            variant.ignore = true     // both work
        }
    }
    ...
}

dependencies {
    ...
}

apply plugin: 'com.google.gms.google-services'

此设置的问题在于,您需要为每个生成的软件包名称创建一个Firebase项目,并且这样做无害:

  • 我不想
  • 我不能,因为我不拥有该项目
  • 我的老板说我不应该
  • (在这里插入另一个有效的借口)

那么为什么我们不根据变体的名称选择性地应用插件呢? Easy-peasy Japanesy,对吧?

dependencies {
    ...
}

android.variantFilter { variant ->
    if (/*  whatever selective logic goes  here  */) {
        apply plugin: 'com.google.gms.google-services'
    }
}

轰!该变体不再被忽略。经过几个痛苦的时间后,我发现再次忽略变体的唯一方法是从底部删除变体过滤器。如何将Google服务插件选择性地应用于变体并且能够忽略其中一个?

1 个答案:

答案 0 :(得分:0)

原来我的答案没有按预期工作。尽管该变体被忽略,但该插件仍然被应用,尽管逻辑似乎反过来说。感谢Jack Feng for this answer,这是有效的解决方案。代码是:

apply plugin: 'com.google.gms.google-services'

android.applicationVariants.all { variant ->
    if (variant.name == 'variantNameYouDontWantFirebaseOn') {
        project.tasks.getByName('process' + variant.name.capitalize() + 'GoogleServices').enabled = false
    }
}