如何为qa/dev/prod构建不同版本的Flutter应用程序?

Set*_*add 23 dart flutter

我正在构建一个Flutter应用程序,我有不同环境(QA,dev,prod等)的不同值的变量.什么是组织我的应用程序的好方法,以便我可以轻松地为QA,开发,生产和其他环境构建?

Jac*_*ips 19

基于Seth的想法,这是一个设置表示BuildEnvironment命名的全局的示例env.

env.dart

import 'package:meta/meta.dart';

enum BuildFlavor { production, development, staging }

BuildEnvironment get env => _env;
BuildEnvironment _env;

class BuildEnvironment {
  /// The backend server.
  final String baseUrl;
  final BuildFlavor flavor;

  BuildEnvironment._init({this.flavor, this.baseUrl});

  /// Sets up the top-level [env] getter on the first call only.
  static void init({@required flavor, @required baseUrl}) =>
      _env ??= BuildEnvironment._init(flavor: flavor, baseUrl: baseUrl);
}
Run Code Online (Sandbox Code Playgroud)

main_dev.dart

import 'package:flutter/material.dart';
import 'env.dart';
import 'app.dart';

void main() {
  BuildEnvironment.init(
      flavor: BuildFlavor.development, baseUrl: 'http://dev.example.com');
  assert(env != null);
  runApp(App());
}
Run Code Online (Sandbox Code Playgroud)

main_prod.dart

import 'package:flutter/material.dart';
import 'env.dart';
import 'app.dart';

void main() {
  BuildEnvironment.init(
      flavor: BuildFlavor.production, baseUrl: 'http://example.com');
  assert(env != null);
  runApp(App());
}
Run Code Online (Sandbox Code Playgroud)
  • 导入env.dart以公开env变量.
  • 使用该target选项运行并构建应用程序.

    flutter run -t lib/main_dev.dart flutter build -t lib/main_dev.dart

要与VS Code集成,请定义启动配置:

.vscode/launch.json

{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "development",
      "program": "lib/main_dev.dart",
      "request": "launch",
      "type": "dart"
    },
    {
      "name": "production",
      "program": "lib/main_prod.dart",
      "request": "launch",
      "type": "dart"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

我原本打算使用传递给Dart main函数的命令行参数,但我不认为args当前可以在命令行上使用flutter run或传递flutter build,尽管VS Code和Android Studio都支持传递args main.由于args可以在构建过程之后传递,因此它看起来像构造命令行arg main是不合适的.

  • 您将如何使用此解决方案并使您的秘密 API 密钥和配置设置不受源代码控制? (4认同)

Set*_*add 18

一种方法:main_<environment>.dartlib/项目目录中创建不同的文件.

每个main_<environment>.dart包含特定于环境的配置/值(例如不同的数据库名称等).main_<environment>.dart然后每个都导入实际的应用程序库并运行应用程序,传入环境的值/配置.

然后,选择.dart要构建的文件:flutter run -t lib/main_debug.dart


Gün*_*uer 11

现在可以使用以下命令获取发布和调试模式

const bool isProduction = bool.fromEnvironment('dart.vm.product');
Run Code Online (Sandbox Code Playgroud)

因为这是一个常数,所以它可以与摇树一起使用。
所以像

if(isProduction) {
  // branch 1
} else {
  // branch 2
}
Run Code Online (Sandbox Code Playgroud)

只会将这两个分支之一包含在生产代码中,具体取决于 isProduction

  • 如果在整个项目中使用,在我看来,它可能容易出错。最好仅在初始化应用程序时使用它。 (3认同)

tat*_*uDn 8

从 Flutter 1.17 开始,您可以使用--dart-define不同的编译时变量来构建您的应用程序。它适用于 Dart 和原生层。例如,在 dart 中,您可以获得这些值String.fromEnvironment。通过这种方式,您将不需要大量或入口点并公开您的环境凭据

这是一篇解释更多的文章 https://link.medium.com/ibuTsWHrk6


Yuc*_*ong 5

更简洁的方法是通过Build Flavors

举个简单的例子,如果您想为“dev”构建的应用程序使用不同的应用程序 ID,则可以在 gradle 文件中包含以下内容:

flavorDimensions "version"
productFlavors {
    dev {
        applicationIdSuffix ".dev"
        versionNameSuffix "-dev"
    }
}
Run Code Online (Sandbox Code Playgroud)

在此处阅读有关 gradle 构建变体配置的更多信息。


现在您可以使用命令行运行此构建变体:

flutter run --flavor dev
Run Code Online (Sandbox Code Playgroud)

如果您使用 Android Studio,您也可以在运行配置中设置构建变体:

在此输入图像描述

在此博客上阅读有关 iOS 配置的更多信息。以及有关构建风格的官方 flutter 文档。


Cop*_*oad 5

import 'package:flutter/foundation.dart';
Run Code Online (Sandbox Code Playgroud)

并使用以下常量值:

if (kReleaseMode) {
  // App is running in release mode. 
} else if (kProfileMode) {
  // App is running in profile mode.
} else if (kDebugMode) {
  // App is running in debug mode.
} else if (kIsWeb) {
  // App is running on the web.
}
Run Code Online (Sandbox Code Playgroud)