前言
作为 App 的开发者,我们在不停地创造 bug,有 bug 时就需要调试。而 bug 有时候在不同环境表现不一会——这就是所谓捉摸不透的 bug,得靠下面的神符才能搞定了。
因此,我们会需要切换环境来调试。但是如果通过修改代码调试一个是不方便,另一个是万一一不小心把环境搞错了直接发到生产了就麻烦了。因此有必要更为优雅的配置不同的环境参数。
方式一:判断是否是生产环境
在实际我们需要根据本地、测试或生产环境配置不同的运行参数,通常是配置接口地址。一种做法是通过判断环境是不是生产环境来配置。
if(bool.fromEnvironment('dart.vm.product')) {
//生产环境参数配置
} else {
//开发环境参数配置
}
方式二:使用配置文件
上述的方式有个缺陷是如果想要调试时切换到生产环境时需要改代码,而且如果有超过2个环境的时候就不好操作了。嗯,有点 Low!
其实,在 Flutter 调试运行的时候,可以指定入口文件,例如:
flutter run -t lib/main_local.dart
flutter run -t lib/main_dev.dart
flutter run -t lib/main.dart
在打包时也可以指定打包的入口文件,命令如下:
flutter build apk -t lib/main_local.dart
flutter build apk -t lib/main_dev.dart
flutter build apk
针对这个特性我们可以使用不同的 main文件来加载对应环境的参数。首先我们建立一个环境变量配置类,分布对应生产(Product)、测试环境(Development)和本地(Local),根据不同的环境枚举返回不同的接口地址:
enum Env {
Product,
Development,
Local
}
class EnvConfig {
static Env env;
static String getBaseUrl(Env env) {
switch (env) {
case Env.Product:
return "https://product-api.host.com/";
case Env.Development:
return "http://dev-api.host.com/";
case Env.Local:
return "http://localhost/api";
default:
return "http://localhost/api";
}
}
}
然后根据环境不同定义不同的 main 入口文件,在该文件的 main 方法中配置不同的环境参数。
// main_dev.dart
void main() {
runApp(MyApp());
CookieManager.instance.initCookie();
HttpUtil.setBaseUrl(EnvConfig.getBaseUrl(Env.Development));
}
// main.dart
void main() {
runApp(MyApp());
CookieManager.instance.initCookie();
HttpUtil.setBaseUrl(EnvConfig.getBaseUrl(Env.Product));
}
之后就可以使用上述的命令运行或者打包对应环境的应用了。
VSCode 调试
VSCode 的调试是一个 json 的配置文件,配置文件的configurations
是一个列表,对应了不同的环境。可以在配置文件的program
参数指定main入口文件。在 VSCode 里也可以配置不同的启动参数调试:
"version": "0.2.0",
"configurations": [
{
"name": "Dev",
"type": "dart",
"request": "launch",
"program": "lib/main_dev.dart"
},
{
"name": "Prod",
"type": "dart",
"request": "launch",
"program": "lib/main.dart"
},
]
在调试的时候,选择不同的配置名称就可以指定调试时的入口文件,例如选择 Dev 开启调试后,会在控制台打印出:
Launching lib/main_dev.dart on iPhone 11 Pro in debug mode...
从而实现我们调试不同环境的目的。
总结
本篇介绍了使用不同的入口文件来解决不同环境切换的问题,通过入口文件而不是改代码可以避免很多问题。同时,VSCode也提供了调试配置参数来切换不同的环境进行代码调试,有了这个工具,也可以快速切换环境来搞定 bug 调试。
网友评论