3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

FlutterAdvent Calendar 2023

Day 1

FlutterプロジェクトでiOSとAndroid向けにもコードフォーマットをかける

Posted at

コードフォーマットやLint処理はコードベースの一貫性、可読性、およびバグの早期発見に寄与し、ソフトウェアプロジェクトの持続可能性を向上させ内部品質の担保に寄与します。

コードフォーマットの実行処理

Flutter は Dart で書かれているものの、処理によっては iOS / Android の実装が必要になる場面があります。
そのため、Dart だけではなく iOS / Android 向けにもコードフォーマットの実行環境を整えています。

formatter の実行は git イベントを hook して実行していますが、変更内容に関わらず各言語の formatter を実行してしまうと無駄に実行時間がかかってしまいます。

そのため、自分が作るプロジェクトでは hook で実行された際に、変更差分を確認しファイルの拡張子に応じて、必要なformatterを実行できるスクリプトを実行しています。

flutter_format.sh
#!/bin/bash

# フォーマット済みの拡張子を格納する配列
formatted_exts=()

# Gitの変更差分を取得し、変更されたファイルの一覧を取得
changed_files=$(git diff --name-only HEAD)

for file in $changed_files; do
  # 拡張子を取得
  ext="${file##*.}"

  # 既にフォーマット済みの拡張子であればスキップ
  if [[ " ${formatted_exts[@]} " =~ " $ext " ]]; then
    continue
  fi

  case $ext in
    "dart")
      # TODO: Dartファイルの場合はdart formatを実行
      formatted_exts+=("$ext")
      ;;
    "swift")
      # TODO: Swiftファイルの場合はSwiftFormatを実行
      formatted_exts+=("$ext")
      ;;
    "kt")
      # TODO: Kotlinファイルの場合はktlintを実行
      formatted_exts+=("$ext")
      ;;
    *)
      # 他の拡張子の場合は何もしない
      ;;
  esac
done

一応実行時間にも触れておくと、上記のスクリプトの中から formatter を実行してもほぼ変化はありません。不要な formatter を実行してしまう時間のことを考えると、むしろ短縮できる場合の方が多いのかなと思います。

// 拡張子を元に実行
time ./script/flutter_format.sh
Formatted lib/main.dart
Formatted 272 files (1 changed) in 1.18 seconds.
./script/flutter_lint.sh  1.44s user 0.21s system 101% cpu 1.634 total
// 直接実行
time fvm dart format test lib
Formatted lib/main.dart
Formatted 272 files (1 changed) in 1.13 seconds.
dart format test lib  1.45s user 0.19s system 104% cpu 1.565 total

各言語向けにコードフォーマットをかける方法

formatterの処理は各プロジェクトの実装内容に応じて良きように設定してください。
自分が実行している内容は参考として記載しておきます。仕様とルールセットも併せて記載しています。

Dart向け

format処理 dart format で実行。fvmなどを利用している場合はちゃんと fvm dart format ... にするのを忘れないように。

チームの方針に応じてルールを変えたい場合は、analysis_options.yaml を作って、そこに設定を追加してください。

iOS向け

iOSはSwiftで構成されているので、SwiftFormat を利用しています。
Flutter は CocoaPods を利用して Pacakge の管理をしているので下記を podfile に追記すれば実行準備が整います。

pod 'SwiftFormat/CLI', '$指定のVer'

SwiftFormat は Pods ディレクトリの中に追加されるので、formatter を実行するには下記のようにします。
下記はFlutterプロジェクトの ios ディレクトリにいる想定です。実行場所によって良きように調整してください。

./Pods/SwiftFormat/CommandLineTool/swiftformat .

チームの方針に応じてルールを変えたい場合は、.swiftformat を作って、そこに設定を追加してください。

Android向け

Android は Kotlin で構成されているので、Ktlint を利用しています。
実行準備を整えるには指定の build.gradle に良きように設定を追加してください。 

formatter は下記で実行できます。
build.gradle がある場所で実行する必要があるのは注意してください。

./gradlew ktlintFormat

チームの方針に応じてルールを変えたい場合は、.editorconfig を作って、そこに設定を追加してください。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?