Flutter 配置多环境打包命令

635 阅读1分钟

1.定义环境变量

// 声明的环境
abstract class EnvName {
  // 环境key
  static const String envKey = "DART_DEFINE_APP_ENV";
  // 环境value
  static const String dev = "dev";
  static const String test = "test";
  static const String pro_test = "pro_test";
  static const String pro = "pro";
}
class BuildConfig {
  //外网正式:PRO   外网测试:PRO_TEST   内网开发:DEV   测试环境:TEST

  static EnvType curEnvType = _curEnvType();
  static const appEnv = String.fromEnvironment(EnvName.envKey);

  static EnvType _curEnvType() {
    switch (appEnv) {
      case EnvName.dev:
        return EnvType.DEV;
      case EnvName.test:
        return EnvType.TEST;
      case EnvName.pro_test:
        return EnvType.PRO_TEST;
      case EnvName.pro:
        return EnvType.PRO;
      default:
        return EnvType.PRO_TEST;
    }
  }
 }

2.项目根目录下新建文件

image.png

.sh在linux上执行


#!/bin/bash

flutter build apk --dart-define=DARTDEFINE_APP_ENV=$1


#!/bin/bash

source build_env.sh pro_test

.bat文件是在windows上双击执行

@echo off
set DARTDEFINE_APP_ENV=%1
start cmd /k "flutter build apk --dart-define=DARTDEFINE_APP_ENV=%DARTDEFINE_APP_ENV%"
@echo on
call build_env.bat pro_test

3.配置包名

在android/app/build.gradle下

import java.text.SimpleDateFormat
project.archivesBaseName = "项目名称"

/// 设置默认配置参数
def dartEnvironmentVariables = [
        DARTDEFINE_APP_ENV: 'dev',
]
if (project.hasProperty('dart-defines')) {
    dartEnvironmentVariables = dartEnvironmentVariables + project.property('dart-defines')
            .split(',')
            .collectEntries { entry ->
                def pair = new String(entry.decodeBase64(), "UTF-8").split('=')
                [(pair.first()): pair.last()]
            }
}

android.applicationVariants.all { variant ->
    def buildType = variant.buildType.name
    if(buildType=='release'){
        def getData = new SimpleDateFormat("YYYYMMddHHmm").format(new Date(System.currentTimeMillis())).toString()
        String dartDefines = ""
        if(dartEnvironmentVariables.DARTDEFINE_APP_ENV=='dev'){
            dartDefines = "内网开发环境"
        }else if(dartEnvironmentVariables.DARTDEFINE_APP_ENV=='test'){
            dartDefines = "测试环境"
        }else if(dartEnvironmentVariables.DARTDEFINE_APP_ENV=='pro_test'){
            dartDefines = "外网测试环境"
        }else if(dartEnvironmentVariables.DARTDEFINE_APP_ENV=='pro'){
            dartDefines = "生产环境"
        }

        variant.assembleProvider.configure {
            def outputApkName = "${project.archivesBaseName}_${variant.versionName}(${variant.versionCode})_${getData}_${dartDefines}.apk"
            def outputFileDir = "${project.rootDir.absolutePath}/buildOutApk/"
            it.doLast {
                variant.outputs.forEach { file ->
                    copy {
                        from file.outputFile
                        into "${outputFileDir}"
                        rename {
                            String srcFileName ->
                                "${outputFileDir}${outputApkName}"
                        }
                    }
                    println("build path:${outputFileDir}${outputApkName}")
                }
            }
        }
    }



}

4.进一步优化配置其他参数

#!/bin/bash

echo "请选择环境:"
echo "1. 开发环境 (dev)"
echo "2. 测试环境 (test)"
echo "3. 外网测试环境 (pro_test)"
echo "4. 生产环境 (pro)"

# 选择环境
echo -n "输入对应的数字 (1-4): "
read ENV_CHOICE

case $ENV_CHOICE in
    1)
        ENV="dev"
        ;;
    2)
        ENV="test"
        ;;
    3)
        ENV="pro_test"
        ;;
    4)
        ENV="pro"
        ;;
    *)
        echo "无效的选择,请输入 1 到 4 之间的数字。"
        exit 1
        ;;
esac

echo "你选择的环境是: $ENV"

# 默认值设置为 false
SANDBOX="false"
PASS="false"
LOGUNITY="false"

# 询问用户是否配置其他参数
echo -n "是否配置其他参数 (y/n): "
read CONFIGURE_OTHERS

if [ "$CONFIGURE_OTHERS" = "y" ]; then
    # 配置支付宝沙盒环境
    echo -n "启用支付宝沙盒环境? (true/false): "
    read SANDBOX_CHOICE
    if [ "$SANDBOX_CHOICE" = "true" ] || [ "$SANDBOX_CHOICE" = "false" ]; then
        SANDBOX=$SANDBOX_CHOICE
    fi

    # 配置提审版本
    echo -n "启用提审版本? (true/false): "
    read PASS_CHOICE
    if [ "$PASS_CHOICE" = "true" ] || [ "$PASS_CHOICE" = "false" ]; then
        PASS=$PASS_CHOICE
    fi

    # 配置打印Unity日志
    echo -n "启用打印Unity日志? (true/false): "
    read LOGUNITY_CHOICE
    if [ "$LOGUNITY_CHOICE" = "true" ] || [ "$LOGUNITY_CHOICE" = "false" ]; then
        LOGUNITY=$LOGUNITY_CHOICE
    fi
fi

# 显示最终配置
echo "环境: $ENV"
echo "支付宝沙盒环境: $SANDBOX"
echo "提审版本: $PASS"
echo "打印Unity日志: $LOGUNITY"

# 构建APK
flutter build apk \
  --dart-define=appEnv=$ENV \
  --dart-define=appIsSandBox=$SANDBOX \
  --dart-define=appIsPass=$PASS \
  --dart-define=appIsLogUnity=$LOGUNITY