简体   繁体   English

如何尽早在 build.gradle 中获取构建类型

[英]How to get the buildtype in a build.gradle EARLY ON

I have a React Native application and I'm trying to specify the folder for storing the generated source map in project.ext.react like so (I need it to implement a library which will help me debug JS errors)我有一个 React Native 应用程序,我正在尝试在project.ext.react指定用于存储生成的源映射的文件夹(我需要它来实现一个可以帮助我调试 JS 错误的库)

project.ext.react = [
        ...
        extraPackagerArgs    : [ "--sourcemap-output", "$buildDir/intermediates/assets/$buildType/index.android.bundle.map" ]
]

As evident, the path should be something like <buildDir>/intermediates/assets/<buildType>/index.android.bundle.map显然,路径应该类似于<buildDir>/intermediates/assets/<buildType>/index.android.bundle.map

(eg <buildDir>/intermediates/assets/release/index.android.bundle.map in case of release and <buildDir>/intermediates/assets/debug/index.android.bundle.map in case of debug) (例如<buildDir>/intermediates/assets/release/index.android.bundle.map在发布的情况下和<buildDir>/intermediates/assets/debug/index.android.bundle.map在调试的情况下)

After referring to several answers on StackOverflow and outside, I'm getting the buildType in the build.gradle by declaring it first and then assigning it:在参考 StackOverflow 和外部的几个答案之后,我通过先声明然后分配它来获取buildType中的 buildType:

//3rd line of build.gradle
def buildType
....
//much later
   applicationVariants.all { variant ->
    buildType = variant.buildType.name 
....

However, this leads to a problem where buildType is initialized much after it is used, and so the output path becomes something like <buildDir>/intermediates/assets/null/index.android.bundle.map , thereby failing the whole process for me.但是,这导致了一个问题,即buildType在使用后会被初始化很多,因此输出路径变得类似于<buildDir>/intermediates/assets/null/index.android.bundle.map ,从而使我的整个过程失败. Is there a way to get the build type earlier on?有没有办法更早地获得构建类型?

我终于找到了一种方法(虽然它不是一个很干净的方法)来查看 gradle 任务数组:

def buildType = gradle.startParameter.taskNames.any{it.toLowerCase().contains("debug")}?"debug":"release"

We have under the buildTypes configuration inside app.gradle something like this:我们必须下buildTypes里面配置app.gradle是这样的:

android.applicationVariants.all { variant ->
    variant.outputs.each { output ->
        //def newApkName = "${APP_NAME}-${variant.name}-${variant.versionName}.apk"
        def newApkName = "${APP_NAME}-${variant.name}-r${COMMIT_SHA}-${BRANCH_NAME}-v${variant.versionName}-${BUILD_NUMBER}.apk"

        variableFile.withWriterAppend { out ->
            out.writeLine("${APP_NAME}-${variant.name}=${APP_NAME}-${variant.name}-r${COMMIT_SHA}-${BRANCH_NAME}-v${variant.versionName}-${BUILD_NUMBER}")
            out.writeLine("${APP_NAME}-${variant.name}versionCode=${VERSION_CODE}")
            out.writeLine("${APP_NAME}-${variant.name}versionName=${variant.versionName}")
        }

        output.outputFile = new File(output.outputFile.parent, newApkName)
    }
}

This sets the apk name and the output folder for each buildType defined in gradle.这会为buildType定义的每个buildType设置 apk 名称和输出文件夹。 We have buildTypes:我们有构建类型:

buildTypes {
    debug {
        buildConfigField('String', 'BUILD_ENV', '"Development"')
        minifyEnabled false
    }
    qa {
        signingConfig signingConfigs.release
        minifyEnabled true
        proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
        buildConfigField('String', 'BUILD_ENV', '"QA"')
    }
    release {
        signingConfig signingConfigs.release
        minifyEnabled true
        proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
        buildConfigField('String', 'BUILD_ENV', '"Production"')
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM