Flavor로 Flutter 빌드 환경 분리하기
프로젝트 구조 설정
1. env 설정
1-1. dotenv 설치
bash
flutter pub add flutter_dotenv
1-2. 최상위 root 폴더에 .env 파일 생성
1-3. pubspec.yaml 파일에 .env 파일 경로 추가
yaml
assets:
- .env.development
- .env.production
2. 환경별 진입점 설정
환경에 맞는 env 설정 호출하기 위해 진입점을 분리
text
lib/
main_dev.dart
main_prod.dart
main.dart
2-1. main.dart 파일 수정
dart
import 'package:flutter/material.dart';
import 'package:flutter_dotenv/flutter_dotenv.dart';
class MainApp extends StatelessWidget {
const MainApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(body: Center(child: Text('env: ${dotenv.env['ENV']}'))),
);
2-2. main_dev.dart 파일 생성
dart
import 'package:flutter/material.dart';
import 'package:flutter_dotenv/flutter_dotenv.dart';
import 'core/config.dart';
import 'main.dart';
void main() async {
await dotenv.load(fileName: '.env.${Env.development}');
runApp(MainApp());
}
2-3. main_prod.dart 파일 생성
dart
import 'package:flutter/material.dart';
import 'package:flutter_dotenv/flutter_dotenv.dart';
import 'core/config.dart';
import 'main.dart';
void main() async {
await dotenv.load(fileName: '.env.${Env.production}');
runApp(MainApp());
}
안드로이드 설정
1. android/app/build.gradle.kts 수정
gradle
android {
...
buildTypes {
getByName("debug") {...}
getByName("release") {...}
}
...
flavorDimensions += "default"
productFlavors {
create("dev") {
dimension = "default"
resValue(
type = "string",
name = "app_name",
value = "App Name DEV"
)
applicationIdSuffix = ".dev"
}
create("prod") {
dimension = "default"
resValue(
type = "string",
name = "app_name",
value = "App Name"
)
}
}
}
2. android/app/src/main/AndroidManifest.xml 수정
xml
android:label="@string/app_name"
iOS 설정
1. Xcode에서 Scheme 생성
Product > Scheme > Manage Schemes → + 버튼으로 dev, prod 스킴 생성
2. 각 스킴에 대응되는 Build Configuration 생성 (Debug-dev, Release-prod 등)
3. Product > Scheme > Manage Schemes를 선택하여 각 스킴에 대응되는 build schemes 설정
4. Bundle Identifier 추가하기
5. 빌드 별 앱 이름 설정
5-1. Editor > Add Build Setting > Add User-defined setting → FLAVOR_APP_NAME으로 추가
5-2. info.plist 파일에 앱 이름 설정 추가
6. Podfile 수정
ruby
project 'Runner', {
...
'Debug-dev' => :debug,
'Debug-prod' => :debug,
'Profile-dev' => :release,
'Profile-prod' => :release,
'Release-dev' => :release,
'Release-prod' => :release,
...
VSCode 설정
.vscode/launch.json 파일 수정
json
{
"version": "0.2.0",
"configurations": [
{
"name": "development",
"request": "launch",
"type": "dart",
"flutterMode": "debug",
"program": "lib/main_dev.dart",
"args": ["--flavor", "dev"]
},
{
"name": "production",
"request": "launch",
"type": "dart",
"flutterMode": "release",
"program": "lib/main_prod.dart",
"args": ["--flavor", "prod"]
}
]
}
실행 명령어
bash
flutter run --flavor dev -t lib/main_dev.dart
flutter run --flavor prod -t lib/main_prod.dart
참고 문서