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

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

この記事からわかること

  • Flutter/Dartflutter_flavorizr使い方
  • 開発/本番環境切り替え

\ アプリをリリースしました /

みんなの誕生日

友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-

posted withアプリーチ

環境

Flutterアプリで環境(フレーバー)ごとに設定を切り替える方法

iOSやAndroidアプリを開発する際に開発環境や本番環境でAPIの向き先が変わったり、設定ファイルを変更したりすることは多いと思います。これを都度手動で切り替えたりするのは大変なのでflutter_flavorizrパッケージを使用して簡単に管理する方法を紹介していきます。

例えばよくあるのは以下の3環境を用意するパターンです。

ビルドタイプ

環境を構築する前に「ビルドタイプ」についても理解しておきます。ビルドタイプとはアプリをビルドする際にどの状態でビルドするかを決めるタイプで、iOSでは「Build Configuration」、Androidでは「buildTypes」として定義されている部分です。デフォルトではそれぞれに「Debug / debug」と「Release / release」が定義されており、開発用と公開用でビルド実行内容が変化します。

この環境(フレーバー)とビルドタイプを組み合わせることでdebugDevreleaseProdのような環境が構築でき、これをflutter_flavorizrを使って簡単に管理できるようになっています。

flutter_flavorizrとは?

pub.dev:flutter_flavorizr

flutter_flavorizrFlutterアプリでフレーバー(環境)を作成・管理できる自動ツールパッケージです。専用の「YAMLファイル(flavorizr.yaml)」にフレーバーごとの設定を記述することでiOS・Android両方のプラットフォームで必要な構成ファイルや設定を自動生成してくれます。

flutter_flavorizr新しくクリーンなFlutterプロジェクト状態での使用が推奨されています。一部のプロセッサは既存のファイルや特定の基本構造を参照するため、既存のプロジェクトで実行するとエラーが発生する可能性があります。

導入

flutter_flavorizrを使用するためには以下のソフトウェアが必要になります。「Ruby」や「Gem」のインストールはこちらの記事の一部などを参考にしてください。

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              # VSCodeAndroid 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.dartConfigurationsにフレーバーが未設定のためAndroid Studioからビルドしようとすると正常にビルドできなくなりました

これを解消するためにAndroid Studioの上部の「main.dart」>「Edit Configurations..」をクリックすると以下の画面になるので「Build flavor」に任意のフレーバーを指定する必要がありました。

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

さらに「+」>「Flutter」から新規でConfigurationを追加することも可能です。そのためにはまずlib/main_{flavor}.dartを作成しておき、「Dart entrypoint」でそのパスを指定、「Build flavor」に任意のフレーバーを指定すれば完了です。「Name」も変更できるのでわかりやすい名前にしておくと良いかもしれません。

.gitignoreへの追加

flutter_flavorizrを使用する場合「.gitignore」に追加するべきファイルは以下のとおりです。


# flutter_flavorizr
.tmp/
assets.tmp.zip

上記のファイルはassets:downloadassets:extractを実行した際に生成されるファイルでflutter_flavorizrで使用するアセットやテンプレートが格納されているファイルです。プロジェクトには必要ないので無視するようにしておきます。

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article