【Flutter/Dart】flutter_flavorizrで開発/本番環境の切り替え

この記事からわかること
- Flutter/Dartでflutter_flavorizrの使い方
- 開発/本番環境の切り替え
index
[open]
\ アプリをリリースしました /
環境
- Android Studio:Meerkat
- Xcode:16.0
- Flutter:3.29.2
- Dart:3.7.2
- flutter_flavorizr:2.4.0
- Mac M1:Sequoia 15.4
Flutterアプリで環境(フレーバー)ごとに設定を切り替える方法
iOSやAndroidアプリを開発する際に開発環境や本番環境でAPIの向き先が変わったり、設定ファイルを変更したりすることは多いと思います。これを都度手動で切り替えたりするのは大変なのでflutter_flavorizr
パッケージを使用して簡単に管理する方法を紹介していきます。
例えばよくあるのは以下の3環境を用意するパターンです。
- 開発環境(dev / Debug)
- ステージング環境(stg / Staging)
- 本番環境(prod / Release)
ビルドタイプ
環境を構築する前に「ビルドタイプ」についても理解しておきます。ビルドタイプとはアプリをビルドする際にどの状態でビルドするかを決めるタイプで、iOSでは「Build Configuration」、Androidでは「buildTypes」として定義されている部分です。デフォルトではそれぞれに「Debug / debug」と「Release / release」が定義されており、開発用と公開用でビルド実行内容が変化します。
- Debug / debug・・・最適化されずデバッグログが出力される
- Release / release・・・最適化されデバッグログが出力されない
おすすめ記事:【Kotlin/Android Studio】ビルド環境を変更する方法!buildConfigField
おすすめ記事:【Xcode】開発環境(ReleaseとDebug)モード(Build Configuration)の切り替え方法
この環境(フレーバー)とビルドタイプを組み合わせることでdebugDev
やreleaseProd
のような環境が構築でき、これをflutter_flavorizr
を使って簡単に管理できるようになっています。
flutter_flavorizrとは?
flutter_flavorizr
はFlutterアプリでフレーバー(環境)を作成・管理できる自動ツールパッケージです。専用の「YAMLファイル(flavorizr.yaml)」にフレーバーごとの設定を記述することでiOS・Android両方のプラットフォームで必要な構成ファイルや設定を自動生成してくれます。
※ flutter_flavorizr
は新しくクリーンなFlutterプロジェクト状態での使用が推奨されています。一部のプロセッサは既存のファイルや特定の基本構造を参照するため、既存のプロジェクトで実行するとエラーが発生する可能性があります。
導入
flutter_flavorizr
を使用するためには以下のソフトウェアが必要になります。「Ruby」や「Gem」のインストールはこちらの記事の一部などを参考にしてください。
- Ruby
- Gem
- xcodeproj(RubyGems 経由)
※ 上記はiOS・macOSのプロジェクトに必要でAndroidのみの場合は不要です
Flutterでflutter_flavorizr
を利用できるようにするために以下のコマンドを実行してパッケージを導入します。
$ flutter pub add flutter_flavorizr
これでパッケージの導入が完了です。
flavorizr.yamlファイルの作成
プロジェクト直下に「flavorizr.yaml」ファイルを作成します。中にフレーバーとその設定を記述していきます。
flavors:
# devフレーバー
dev:
app:
name: "MyApp Debug"
android:
applicationId: "com.example.sample.dev"
ios:
bundleId: "com.example.sample.dev"
# stgフレーバー
stg:
app:
name: "MyApp Staging"
android:
applicationId: "com.example.sample.stg"
ios:
bundleId: "com.example.sample.stg"
# prodフレーバー
prod:
app:
name: "MyApp Release"
android:
applicationId: "com.example.sample"
ios:
bundleId: "com.example.sample"
基本的にはflavors
の中に定義したいフレーバーを記述します。例えば上記は「dev」、「stg」、「prod」の3つのフレーバーを定義しそれぞれのアプリ名とアプリID(BundleID)をフレーバーごとに切り替えています。
他にも利用可能なフィールドはたくさんあるので詳しくは「available-fields」を参考にしてください。
自動生成コマンドの実行
「flavorizr.yaml」ファイルへの記述が完了したら以下のコマンドを実行します。するとDo you want to proceed? (Y/n)
と問われるのでY
と入力すればフレーバー切り替えに必要な設定ファイルなどを自動生成してくれます。
$ flutter pub run flutter_flavorizr
上記コマンドを実行することで全てのプロセッサが実行されますが、特定のプロセッサのみ実行したい場合は-p
オプションの後に実行したいプロセッサを指定すればOKです。
$ flutter pub run flutter_flavorizr -p flutter:app, flutter:pages, flutter:main
プロセッサの種類
- assets:download # 外部から外部からアセットテンプレートをダウンロードする
- assets:extract # ダウンロードしたアセットを展開(解凍)する
- android:androidManifest # AndroidManifest.xml にフレーバーごとの設定を追加
- android:flavorizrGradle # flavorizr 専用の Gradle プラグイン設定を適用
- android:buildGradle # build.gradle に flavor 設定や applicationId を追加
- android:dummyAssets # Android 用のダミーアセットを作成
- android:icons # Android のアプリアイコンをフレーバーごとに設定
- flutter:flavors # フレーバーを Dart 側で扱うための設定ファイル群を生成
- flutter:app # アプリ本体(lib/app.dart など)の共通エントリーポイントを生成
- flutter:pages # 初期ページ(HomePage など)を自動生成
- flutter:main # mainエントリーポイントを分離
- ios:podfile # Podfile にフレーバー対応の設定を追加
- ios:xcconfig # フレーバーごとの xcconfig(ビルド設定)ファイルを生成
- ios:buildTargets # iOS のビルドターゲットをフレーバーごとに作成
- ios:schema # Xcode のスキーム(dev, prod など)をフレーバーごとに作成
- ios:dummyAssets # iOS 用のダミーアセットを生成(必要に応じて)
- ios:icons # iOS のアプリアイコンをフレーバーごとに設定
- ios:plist # Info.plist をフレーバーごとに生成し、名前やURLなどを個別管理
- ios:launchScreen # LaunchScreen.storyboard をフレーバーごとに設定
- google:firebase # Google Firebase 用の設定ファイルをフレーバーごとに配置(GoogleService-Info.plist / google-services.json)
- huawei:agconnect # Huawei の agconnect-services.json をフレーバーごとに配置(HMS対応)
- assets:clean # 不要な一時アセットをクリーンアップ
- ide:config # VSCodeやAndroid Studio用のIDE実行設定を生成(launch.jsonなど)
またrun
コマンド時以外でも「flavorizr.yaml」に実行したいプロセッサを記載しておくことで実行するプロセッサをファイルで管理することも可能です。実行する順番によっては動作しないこともあるので注意してください。
instructions:
- assets:download # これがないとflutter:appなどで失敗するので注意
- assets:extract # これがないとflutter:appなどで失敗するので注意
- flutter:flavors
- flutter:app
- flutter:pages
- flutter:main
プロセッサを実行することで色々なファイルが自動生成&更新されます。
※ 自動生成されるファイルのコミット履歴
例えばflutter:main
プロセッサでは「main.dart」ファイルの中身を以下のようにフレーバーに応じてアプリ内で切り替えられるようにF.appFlavor
にフレーバーをセットしています。既存のコードがある場合でも問答無用で置き換わってしまうので注意してください。
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'app.dart';
import 'flavors.dart';
void main() {
F.appFlavor = Flavor.values.firstWhere(
(element) => element.name == appFlavor,
);
runApp(const App());
}
ここで必要なのは以下部分だけなので既存プロジェクトの場合はここだけコピーすれば良いと思います。
F.appFlavor = Flavor.values.firstWhere(
(element) => element.name == appFlavor,
);
最後に作成したフレーバーごとにアプリをビルドしてみます。これで環境ごとに設定や構成を変更することが可能になります。
$ flutter run --flavor pub -t lib/main.dart
$ flutter run --flavor stg -t lib/main.dart
$ flutter run --flavor dev -t lib/main.dart
Configurations設定
古い記事を見るとflutter pub run flutter_flavorizr
コマンドの実行でlib/main_{flavor}.dart
ファイルが自動生成され、Configurationsにも自動で追加されているようでしたが、最新のバージョンからなのか自動生成はされませんでした。さらにデフォルトであるlib/main.dart
のConfigurationsにフレーバーが未設定のためAndroid Studioからビルドしようとすると正常にビルドできなくなりました。
これを解消するためにAndroid Studioの上部の「main.dart」>「Edit Configurations..」をクリックすると以下の画面になるので「Build flavor」に任意のフレーバーを指定する必要がありました。

さらに「+」>「Flutter」から新規でConfigurationを追加することも可能です。そのためにはまずlib/main_{flavor}.dart
を作成しておき、「Dart entrypoint」でそのパスを指定、「Build flavor」に任意のフレーバーを指定すれば完了です。「Name」も変更できるのでわかりやすい名前にしておくと良いかもしれません。
.gitignoreへの追加
flutter_flavorizr
を使用する場合「.gitignore」に追加するべきファイルは以下のとおりです。
# flutter_flavorizr
.tmp/
assets.tmp.zip
上記のファイルはassets:download
とassets:extract
を実行した際に生成されるファイルでflutter_flavorizr
で使用するアセットやテンプレートが格納されているファイルです。プロジェクトには必要ないので無視するようにしておきます。
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。