mcpField
F
flutter-config

flutter-config

github.com/dhruvanbhalara開発30248 回インストール8 週間前に更新
リポジトリ

flutter-config について

単一のmain.dartでdev、staging、prodのflavorを管理するFlutter向け設定スキルです。設定の集約、プラットフォーム別のflavor、Firebaseの分離、シークレットの扱いを説明します。

主な機能

  1. 01単一エントリーポイントで3種のflavorを設定
  2. 02flavor別のJSON設定
  3. 03AppConfigによる値の集約
  4. 04AndroidとiOSのflavor設定
  5. 05flavorごとのFirebaseプロジェクト分離
  6. 06シークレット管理の指針

活用シーン

  1. 01dev、staging、prodのビルド実行
  2. 02環境固有の設定の一元管理
  3. 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 な Flavor enum を使用します: 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 を使用します: フレーバーごとに個別のエントリポイントを絶対に作成しないでください

コメント