flutter-config について
単一のmain.dartでdev、staging、prodのflavorを管理するFlutter向け設定スキルです。設定の集約、プラットフォーム別のflavor、Firebaseの分離、シークレットの扱いを説明します。
主な機能
- 01単一エントリーポイントで3種のflavorを設定
- 02flavor別のJSON設定
- 03AppConfigによる値の集約
- 04AndroidとiOSのflavor設定
- 05flavorごとのFirebaseプロジェクト分離
- 06シークレット管理の指針
活用シーン
- 01dev、staging、prodのビルド実行
- 02環境固有の設定の一元管理
- 03プラットフォーム別flavorとFirebaseの設定
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ dhruvanbhalara/ skills --skill flutter-configインストール後、Claude Code で/flutter-configを入力して読み込まれたか確認します。
詳細
フレーバーアーキテクチャ
- 3 つのフレーバーを定義します:
dev、staging、prod - すべてのフレーバーで 単一の
main.dartエントリポイントを使用します - フレーバー固有の設定は
--dart-define-from-fileを介して渡します:flutter run --flavor dev --dart-define-from-file=config/dev.json flutter run --flavor staging --dart-define-from-file=config/staging.json flutter run --flavor prod --dart-define-from-file=config/prod.json - 個別の
main_dev.dart、main_staging.dart、main_prod.dartエントリポイントを絶対に作成しないでください
設定 JSON の構造
- フレーバーごとの JSON 設定ファイルをプロジェクトルートの
config/ディレクトリに配置します:config/ ├── dev.json ├── staging.json └── prod.json config/dev.jsonの例:{ "FLAVOR": "dev", "BASE_URL": "https://api-dev.example.com", "APP_NAME": "MyApp Dev", "ENABLE_LOGGING": "true", "ENABLE_CRASHLYTICS": "false" }- これらの JSON ファイルにシークレット(API キー、署名資格情報)を絶対に含めないでください: CI で注入される環境変数または
flutter_secure_storageを使用します - 環境固有のシークレットが含まれる場合は
config/*.jsonを.gitignoreに追加します。それ以外の場合はチームの利便性のためにコミットします
エントリポイントのパターン
// lib/main.dart
void main() {
const flavor = String.fromEnvironment('FLAVOR', defaultValue: 'dev');
AppConfig.init(flavor: Flavor.fromString(flavor));
runApp(const App());
}
- すべてのコンパイル時値は
String.fromEnvironment('KEY')またはbool.fromEnvironment('KEY')を介して読み取ります - sealed な
Flavorenum を使用します:sealed class Flavor { dev, staging, prod } AppConfigはフレーバー、ベース URL、フィーチャーフラグ、Firebase 設定を保持するシングルトンです
環境設定
- フレーバーごとの設定を集約した
AppConfigクラスに格納します:baseUrl: 環境ごとの API エンドポイントenableLogging: dev のみで詳細ログを有効化enableCrashlytics: dev では無効化appName: フレーバーごとの表示名(例: 「MyApp Dev」、「MyApp」)
- すべての値は
--dart-define-from-fileを介して JSON ファイルから取得します: Dart コードにフレーバーごとのロジックをハードコードしないでください - JSON 設定ファイルにシークレットを絶対に含めないでください:
flutter_secure_storageまたは CI で注入される環境変数を使用します
プラットフォーム固有のフレーバー設定
Android
android/app/build.gradleにflavorDimensionsとproductFlavorsを定義します:flavorDimensions "environment" productFlavors { dev { dimension "environment"; applicationIdSuffix ".dev"; resValue "string", "app_name", "MyApp Dev" } staging { dimension "environment"; applicationIdSuffix ".staging"; resValue "string", "app_name", "MyApp Staging" } prod { dimension "environment"; resValue "string", "app_name", "MyApp" } }
iOS
- フレーバーごとに Xcode スキームを作成します(Dev、Staging、Prod)。
- フレーバーごとのバンドル ID、表示名、署名には xcconfig ファイルを使用します。
ios/Runner.xcodeprojで Flutter フレーバーを Xcode スキームにマッピングします。- Swift Package Manager 統合: iOS フレーバーを設定する際、Xcode スキームはパッケージ依存関係の構成を自動的にマッピングします。SPM では CocoaPods の
Podfileの変更は不要です。すべての依存関係のオーバーライドは、Xcode の Runner プロジェクト設定内の Package Dependencies の下で定義されていることを確認してください。
フレーバーごとの Firebase
- フレーバーごとに別々の Firebase プロジェクトを使用します(dev、staging、prod)
google-services.json(Android)とGoogleService-Info.plist(iOS)をフレーバー固有のディレクトリに配置します- 各環境に対して
--projectフラグを付けてflutterfire configureを使用します
ビルドコマンド
# Development
flutter run --flavor dev --dart-define-from-file=config/dev.json
# Staging
flutter run --flavor staging --dart-define-from-file=config/staging.json
# Production release
flutter build appbundle --flavor prod --dart-define-from-file=config/prod.json --release
flutter build ipa --flavor prod --dart-define-from-file=config/prod.json --release
ルール
- 環境固有の値(URL、API キー、フィーチャーフラグ)を絶対にハードコードしないでください
- 本番のシークレットを絶対にリポジトリにコミットしないでください
- すべてのチームメンバーは、単一のコマンドで任意のフレーバーをローカルで実行できる MUST があります
- CI/CD パイプラインは
--flavorと--dart-define-from-fileの両方を明示的に指定する MUST があります - 単一の
main.dartを使用します: フレーバーごとに個別のエントリポイントを絶対に作成しないでください
コメント
Markdown 対応