如何将插件仅应用于gradle中的一种风格?

时间:2015-07-13 09:31:10

标签: android android-studio gradle newrelic android-productflavors

我有一个多风格,多构建类型的android项目,我想整合NewRelic插件。但我必须只为其中一个顾客申请,因此只适用于一种产品风味 NewRelic使用检测,如果我在那里应用插件,插件会生成其他风格的代码,这是我们不允许的。

所以我的问题是:如何在gradle文件中使用apply plugin: something命令仅应用于我的一种口味?

6 个答案:

答案 0 :(得分:34)

使用此代码:

getGradle().getStartParameter().getTaskRequests().toString()

[DefaultTaskExecutionRequest{args=[:app:generateDevelopDebugSources],projectPath='null'}]会返回Develop之类的内容,因此评论[(time1, a, b), (time2, c, d), (time3, e, f), (time4, g, h), ...] 中所述必须以大写字母开头。

答案 1 :(得分:11)

  1. 定义变量 - def fl
  2. 在Flavors(和/或build)中初始化变量

        productFlavors {
    
                freeFlavour {
                    (...)
                    fl = "free"
                }
    
                paidFlavour {
                    (...)
                    fl = "paid"
                }
            }
    
  3. 使用if语句 -

    if (fl == "free") { apply plugin: something }

答案 2 :(得分:2)

尝试了不同的解决方案,但没有一个对我有用。这是我想出的,并且据我测试似乎可以正常工作:

WITH a AS (SELECT registrations.user_id, registrations.reg_date, logins.login_date, Row_number() OVER( partition BY registrations.user_id ORDER BY logins.login_date DESC) row_num FROM registrations INNER JOIN logins ON registrations.user_id = logins.user_id WHERE logins.login_date BETWEEN Hours_add(registrations.reg_date, 24) AND Hours_add(registrations.reg_date, 48)) SELECT * FROM a WHERE row_num = 1

build.gradle

在配置之外,在productFlavors { someFlavorWithGoogleGcm { dimension "type" applicationId "com.example.withGcm" ext.useGoogleGcm = true } someFlavorWithoutGoogleGcm { dimension "type" applicationId "com.example.withoutGcm" } } 文件中:

build.gradle

答案 3 :(得分:1)

我只是在应用程序级别build.gradle的风味中使用了apply plugin: 'com.google.gms.google-services',效果很好。

productFlavors {
    ..... your other flavors ....
    yourFlv {
        ....
        ....
        apply plugin: 'com.google.gms.google-services'
    }
}

不需要额外的步骤。

答案 4 :(得分:0)

对于 Google 服务 Gradle 插件,以下内容有效。

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

afterEvaluate {
    tasks.matching { it.name.contains("GoogleServices") && !it.name.contains(yourFlavorName) }*.enabled = false
}

其中 yourFlavorName 是一个大写字符串,包含必须应用插件的风味名称;所有其他风格不使用该插件。

请注意,该插件仍然适用于其他风味;此解决方案只是为他们禁用 *GoogleServices* 任务。这假设 Google 服务 Gradle 插件仅通过添加包含子字符串 "GoogleServices" 的任务来应用更改,这在将来可能无法工作。

要检查这是否有效,您可以检查依赖项,例如像这样:

./gradlew app:dependencyInsight --configuration yourFlavorNameDebugCompileClasspath --dependency google | grep -i services

这应该显示 yourFlavorName 的一些依赖项,但不显示其他风味名称的依赖项:

./gradlew app:dependencyInsight --configuration otherFlavorNameDebugCompileClasspath --dependency google | grep -i services

答案 5 :(得分:0)

升级到 Gradle 4.2 后,Tarps 的方法停止工作,所以我最终将其与 Erik 的答案结合起来。

ext.useGoogleGcm 中的每种口味设置 build.gradle

productFlavors {
    a {
        ...
        ext.useGoogleGcm = true
    }
    b {
        ...
        ext.useGoogleGcm = false
    }
}

然后在文件底部:

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

afterEvaluate {
    android.productFlavors.each { flavor ->
        tasks.matching {
            it.name.contains('GoogleServices') && it.name.contains(flavor.name.capitalize())
        }*.enabled = flavor.ext.useGoogleGcm
    }
}

在您的 assembleRelease 任务的输出中,您应该看到名称中带有“GoogleServices”的任务已经为真任务运行,为假任务跳过。如果您的构建抱怨 toCapitalize,您可以在 toLowerCaseit.name 上使用 flavor.name