如何从gradle任务中获取风味名称

时间:2019-10-17 12:39:46

标签: android gradle

我有以下gradle设置:

apply plugin: 'com.android.application'

def projectName

android {
    ...
    flavorDimensions "project"
    productFlavors {
        demo {
            dimension "project"
        }
        full {
            dimension "project"
        }
    }
    ...
    applicationVariants.all { variant ->
        variant.outputs.all {
            projectName = variant.flavorName
        }
    }
}
...
task myTask(type: Copy) {
    println "flavor name is $projectName"
    ...
}
preBuild.dependsOn myTask

但是,println在我的命令行/终端中没有显示风味名称。我想念什么吗?我以此为参考:How to get current flavor in gradle。请注意,我必须在prebuild之前运行任务。

3 个答案:

答案 0 :(得分:0)

查看情况并找到解决方法后,似乎preBuild不能满足您的要求。

可能会从项目容器中afterEvaluate阻止是一种对您有帮助的解决方案。

您的参考文献How to get current flavor in gradle具有此answer,有助于找出当前产品风味,然后从applicationVariant对其进行调用将非常有帮助。了解如何:

返回当前产品风味的定义方法

def getCurrentVariant() {
    Gradle gradle = getGradle()
    String tskReqStr = gradle.getStartParameter().getTaskRequests().toString()

    Pattern pattern;

    if (tskReqStr.contains("assemble"))
        pattern = Pattern.compile("assemble(\\w+)(Release|Debug)")
    else
        pattern = Pattern.compile("generate(\\w+)(Release|Debug)")

    Matcher matcher = pattern.matcher(tskReqStr)

    if (matcher.find()) {
        return matcher.group(1).toLowerCase() // Changing to 2 will return build type, 1 provides product flavor
    } else {
        println "NO MATCH FOUND"
        return "";
    }
}

然后在应用程序级别 build.gradle 中写出{strong>项目容器的afterEvaluate块:

project.afterEvaluate { // This container evaluates after successful sync
    android.applicationVariants.all { variant -> // We can detect all application variants
        variant.outputs.each { output -> // find out each outputs
            def taskName = "Variant -> $output.name"
            def list = output.name.tokenize('-') // Splitting output name by '-'
            println(taskName)
            if (getCurrentVariant().contains(list.get(0))) // Check if current variant matches with particular output variant
                println(getCurrentVariant())
        }
    }
}

我希望这能满足您的要求。

编辑:

不知道您是否仍然想要这样做,请尝试以下操作:

tasks.create('getCurrentFlavor') {
    Gradle gradle = getGradle()
    String tskReqStr = gradle.getStartParameter().getTaskRequests().toString()

    Pattern pattern;

    if (tskReqStr.contains("assemble"))
        pattern = Pattern.compile("assemble(\\w+)(Release|Debug)")
    else
        pattern = Pattern.compile("generate(\\w+)(Release|Debug)")

    Matcher matcher = pattern.matcher(tskReqStr)

    if (matcher.find()) {
        println matcher.group(1).toLowerCase() // Changing to 2 will return build type, 1 provides product flavor
    } else {
        println "NO MATCH FOUND"
    }
}

tasks.getByName('preBuild') {
    dependsOn getCurrentFlavor
}

答案 1 :(得分:0)

  

gradle当前的口味

在为我们的一款游戏进行更新时,我需要弄清楚如何获得当前的风格并在代码中使用它。由于有很多方法可以执行此操作,因此我选择创建一个自定义build config参数并在我拥有的每个变量中设置值。

  

添加新的构建配置字段

第一件事是在您的口味中添加新的构建配置属性。使用buildConfigField可以帮助我们做到这一点。因此,我定义了一个名为String的{​​{1}},并根据我的口味将其值设置为付费或免费。

VARIANT

即使您不知道应该将productFlavors { paid { ... buildConfigField "String", "VARIANT", "\"paid\"" } free { ... buildConfigField "String", "VARIANT", "\"free\"" } } 放在哪里,它也要放在productFlavors的android定义中

这样做,您可以使用build.gradle.生成的BuildConfig类在代码中访问该值。您可以使用同一类来检查当前版本是否处于调试/发布模式或其他内容。

  

获取当前的风味名称

现在,要访问新创建的属性并使用它,我将执行以下操作:

Gradle

答案 2 :(得分:0)

这就是解决我的问题的原因。

apply plugin: 'com.android.application'

def projectName

android {
    ...
    flavorDimensions "project"
    productFlavors {
        demo {
            dimension "project"
        }
        full {
            dimension "project"
        }
    }
    ...
}
...

//
// This function is what I added (from @Jeel Vankhede answer)
//
task getCurrentFlavor() {
    Gradle gradle = getGradle()
    String tskReqStr = gradle.getStartParameter().getTaskRequests().toString()

    Pattern pattern

    if (tskReqStr.contains("assemble"))
        pattern = Pattern.compile("assemble(\\w+)(Release|Debug)")
    else
        pattern = Pattern.compile("generate(\\w+)(Release|Debug)")

    Matcher matcher = pattern.matcher(tskReqStr)

    if (matcher.find()) {
        projectName = matcher.group(1).toLowerCase() // Changing to 2 will return build type, 1 provides product flavor
    } else {
        println "NO MATCH FOUND"
    }
}

task myTask(type: Copy) {
    dependsOn getCurrentFlavor
    println "flavor name is $projectName"
    ...
}
preBuild.dependsOn myTask

基本上,我通过dependsOn getCurrentFlavor添加了Jeel Vankhede的答案(如我的gradle文件中所述)。这样,我们可以确定在实际在projectName任务中使用变量之前先填充myTask变量。