如何在Gradle中获取当前构建类型

29

我的问题非常直接易懂。

问题

在Gradle中,有没有办法在运行时获取当前的构建类型。例如,在运行assembleDebug任务时,build.gradle文件中的任务是否可以根据该任务与debug构建变体相关这一事实来做出决策?

示例代码

apply plugin: 'com.android.library'
ext.buildInProgress = "" 

buildscript {

repositories {
    maven {
        url = url_here
    }
}

dependencies {
    classpath 'com.android.tools.build:gradle:3.0.1'
}
}


configurations {
     //get current build in progress here e.g buildInProgress = this.getBuildType()
}

android {
     //Android build settings here
}

buildTypes {
         release {
          //release type details here
      }

       debug {
           //debug type details here
       }

    anotherBuildType{
          //another build type details here
    }

   }
}

dependencies {
      //dependency list here
}

repositories{
         maven(url=url2_here)
}


task myTask{
      if(buildInProgress=='release'){
           //do something this way
      }
      else if(buildInProgress=='debug'){
          //do something this way
      }
      else if(buildInProgress=='anotherBuildType'){
         //do it another way
     }
}

总结

我是否有办法在myTask{}中得到正在进行的构建类型的精确信息?


你找到解决方案了吗?我正在尝试解决下一个任务 https://stackoverflow.com/questions/52677223/how-to-check-if-current-build-is-debug-or-release-in-build-gradle - user924
10个回答

22
您可以通过解析 applicationVariants 来获取确切的构建类型。
applicationVariants.all { variant ->
    buildType = variant.buildType.name // sets the current build type
}

一个实现可能看起来像以下这样:

def buildType // Your variable

android {
    applicationVariants.all { variant ->
        buildType = variant.buildType.name // Sets the current build type
    }
}

task myTask{
    // Compare buildType here
}

此外,您还可以检查这个这个类似的答案。

更新

这个这个问题的回答帮助了提问者解决了问题。


4
我尝试过这个,但它不起作用。当我在myTask内进行检查时,buildType为null。 - Naz_Jnr
3
这是一个库项目而不是应用程序,因此我使用了“libraryVariants.all”而不是“applicationVariants.all”。 - Naz_Jnr
且其为null:在空对象上无法调用方法contains() - user924
22
这个解决方案就像魔术一样。你在循环处理“所有”构建变体时,多次分配了buildType,最后恰好赋值为当前正确的构建类型,可能是巧合。 - Peter
1
这个已经不再起作用了。迭代顺序与当前的构建类型无关。 - Petrakeas
显示剩余6条评论

2

这对我有效

applicationVariants.all { variant ->
    def variantType = variant.buildType.name
    println "Variant type: $variantType"
    if (variantType == "debug") {
       // do stuff
    }
}

你是在哪里执行的,是在 app/build.gradle 文件中吗? - user1841702
需要在应用级别的 Gradle 中。 - Ashish Kshirsagar
我运行这个程序时出现了错误:无法获取未知属性'applicationVariants' - Stealth Rabbi
我不确定你的应用程序 Gradle 看起来是什么样子的。我怀疑这可能是由于较低的 Gradle 版本或者您正在为库执行此操作。对于库,请使用“libraryVariants”而不是“applicationVariants”。Gradle 支持这些扩展。更多信息请参见 https://google.github.io/android-gradle-dsl/current/com.android.build.gradle.AppExtension.html。 - Ashish Kshirsagar
在根级别的build.gradle文件中获取flavor名称是否可行? - chitgoks

0

我查看了其他答案,都不起作用。 以下内容将有所帮助。 在您的 build.gradle (:app) 中:

tasks.all { Task task ->
    if (task.name == "preDebugBuild") {
        doFirst {
            //for debug build
        }
    } else if (task.name == "preReleaseBuild") {
        doFirst {
            //for release build
        }
    }
}

dependencies {
    ...
}

请注意,您放置在其中的代码不会在更改构建变体时执行,而是在构建应用程序时执行。

0
如果您想在版本名称中后缀构建类型名称(就像我一样),只需将此行添加到版本名称中:
debug {
    versionNameSuffix "-debug"
}

通过这种方式,您可以在构建名称中识别构建类型。而且它可以在不声明任何其他内容的情况下工作。


0

在你的Gradle中尝试像这样:对我来说它很好用

//get current build all params as string
def buildParams = getGradle().getStartParameter().toString().toLowerCase();

applicationVariants.all { variant ->
    variant.outputs.all {
        def typename = variant.buildType.name.toLowerCase();

        //and check build state in all variants
        if(buildParams.contains(typename)) {
            // finally, you get what you want.
        }
    }
}

0
我是通过以下方式获取构建类型的:
BuildConfig.BUILD_TYPE

如果您需要检查当前的构建类型,请在您的utils包中创建一个枚举类,并在if语句中使用它:
enum class Environment(val value: String) {
   RELEASE("release"),
   LOCAL("local"),
   STAGING("staging"),
   DEBUG("debug")
}

你的if/when语句:

if (BuildConfig.BUILD_TYPE == Environment.RELEASE.value) {
     //TODO
} else if(...)

或者通过何时:

when(BuildConfig.BUILD_TYPE) {
   Environment.RELEASE.value -> { //TODO }
   Environment.LOCAL.value -> { // TODO }
   // etc.
}

0

0

在Kotlin编程语言中获取当前Android平台构建期间使用的正确方法(Java的逻辑相同)

project.afterEvaluate {
   this.android().variants().all {

      this.assembleProvider.configure {

         this.doLast{
            val variant = this@all

            variant.outputs
                       .map
                       .forEach{
                           //do something with current buildType, or build flavor or whatever
                           println(variant.flavorName)
                           println(variant.buildType)
                       }
         }
      }
   }
}

-2

这是我用来检测运行时构建类型的方法,而不需要在构建时声明任何变量。

def isCurrentBuildType(buildType) {
  return gradle.getStartParameter().taskNames.find({ it.endsWith(buildType) }) != null
}

print(isCurrentBuildType("Release")) //prints true if the current build type is release.

请注意,第一个字母应该是大写的(例如:assembleRelease、bundleRelease)。

构建类型并不总是最后的。使用.contains而不是.endsWith。例如:testDebugUnitTests - Samuel Neff

-3
你可以通过解析你的applicationVariants来获取确切的构建类型: applicationVariants.all { variant -> buildType = variant.buildType.name // 设置当前的构建类型 }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接