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

时间:2017-11-22 15:36:51

标签: dart flutter

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

9 个答案:

答案 0 :(得分:17)

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

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

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

答案 1 :(得分:12)

在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);
}

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());
}

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());
}
  • 导入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"
    }
  ]
}

我本来打算使用传递给Dart的main函数的命令行参数,但是我不认为args当前可以通过flutter runflutter build在命令行中传递,尽管VS Code和Android Studio都支持将args传递给main。还将seems的构建风味作为main的命令行arg不合适,因为可以在构建过程之后 传递args。

答案 2 :(得分:7)

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

const bool isProduction = bool.fromEnvironment('dart.vm.product');

因为这是一个常量,所以可以与摇树一起使用。
像这样的代码

if(isProduction) {
  // branch 1
} else {
  // branch 2
}

根据isProduction

仅将这两个分支之一包含在生产代码中

答案 3 :(得分:4)

从Flutter 1.17开始,您可以使用--dart-define使用不同的编译时间变量来构建您的应用程序。它适用于Dart和本机层。在dart中,您可以使用String.fromEnvironment获得这些值。这样,您将无需拥有大量入口或入口点即可公开您的环境凭据

这是一篇说明更多https://link.medium.com/ibuTsWHrk6

的文章

答案 4 :(得分:1)

更干净的方法是通过 Build Flavors

举个简单的例子,如果您想为“开发”版本的应用使用不同的应用ID,则可以在gradle文件中使用它:

flavorDimensions "version"
productFlavors {
    dev {
        applicationIdSuffix ".dev"
        versionNameSuffix "-dev"
    }
}

详细了解gradle构建变体配置here


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

flutter run --flavor dev

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

enter image description here

在此blog上了解有关iOS配置的更多信息。以及有关build flavours的正式文件。

答案 5 :(得分:1)

socket.join()

并使用以下const值:

import 'package:flutter/foundation.dart';

答案 6 :(得分:0)

只需您可以实现构建变体。

在android中:

buildTypes {
    release {
        // TODO: Add your own signing config for the release build.
        // Signing with the debug keys for now, so `flutter run --release` works.
        signingConfig signingConfigs.release
    }
    debug{
        applicationIdSuffix ".dev"
        signingConfig signingConfigs.debug
    }
   qa{
        applicationIdSuffix ".qa"
        signingConfig signingConfigs.qa
    }
}

在iOS中:

通过选择project-&gt; runner-&gt;添加配置配置添加一个

答案 7 :(得分:0)

其他信息:

我遇到了同样的问题,并使用了塞思·拉德(Seth Ladd)建议的解决方案。因此,我还需要为每个应用程序版本(dev / prod)使用不同的配置,并且我不想在main_dev.dart或main_prod.dart文件中写入配置。

我写了一个简单的flutter程序包,处理单独的配置文件并在应用程序启动时加载它们。然后可以在应用程序的每一行代码中使用该配置。

https://github.com/Ephenodrom/Flutter-Global-Config

如何使用它:

在assets / cfg / $ file.json下创建一个json文件

将资产/ cfg添加到您的pubspec.yaml

在应用启动时加载不同的配置文件:

import 'package:flutter/material.dart';
import 'package:global_configuration/global_configuration.dart';

void main() async{
  await GlobalConfiguration().loadFromAsset("app_settings");
  await GlobalConfiguration().loadFromAsset("env_dev_settings");
  runApp(MyApp());
}
class MyApp extends StatelessWidget {
  ...
}

使用应用程序中的配置:

import 'package:flutter/material.dart';
import 'package:global_configuration/global_configuration.dart';

class CustomWidget extends StatelessWidget {

    CustomWiget(){
        // Access the config in the constructor
        print(GlobalConfiguration().getString("key1"); // prints value1
    }

    @override
     Widget build(BuildContext context) {
        // Access the config in the build method
        return new Text(GlobalConfiguration().getString("key2"));
     }
}

答案 8 :(得分:0)

在项目app_environment.dart的根目录下创建一个文件。使用kReleaseMode程序包中的foundation.dart变量检查生产模式。

import 'package:flutter/foundation.dart';

class AppEnvironment {

  String getApiURL() {
    if (kReleaseMode) {
      return 'PROD_API_URL';
    } else {
      return 'STAGING_API_URL';
    }
  }
}