iOSアプリのビルドログからワーニングを効率的に抽出する

2024.04.15

iOSアプリのワーニング修正時、どのようなワーニングが出ているのかを確認しようとすると、XcodeのUI上から表示が消えてしまったり、修正したはずのワーニングが残り続ける場合がある。

ここ最近のXcodeは不安定なことが多く、ビルド時の情報(中間データ等)がキャッシュされたり、意図せずにクリアされたりする。具体的な例でいうと、ソースコードを修正したにも関わらず、その修正が反映されずにビルドが終わり、シミュレータで実行されるようなことまである。根本原因が同じかまでは不明だが、ワーニングの表示も安定せず、修正していないにも関わらずワーニングの表示が消えたりと、修正が難航することがある。

本記事では、iOSアプリのビルドログを取得し、スクリプトを使用して、ワーニングの種類ごとに並び替えたログを取得する方法を紹介する。冪等性が保証された結果を利用するため、CUI上でxcodebuildを使用し、ビルドログを確認する方法を採用する。

xcodebuild を利用してビルドログを出力する

まずはxcodebuildを使って、iPhone シミュレーター向けのビルドを行う。xcodebuildを利用するのは、GUIでキャッシュされることを防ぐためである。

xcodebuild の使い方については「Xcodeでのビルドを自動化するxcodebuildコマンドとIPAファイルを作成してiTunes Connect(Testflight)に投げる方法」が詳しいが、Xcode 6の頃 (約9年前)の記事のため、Xcode 15が主流の現在ではあまり参考にならないかもしれない。

Terminal上で以下のコマンドを実行する。xcodebuildが出力したビルドログは build_log.txt に保存される。

cd {PROJECT_DIR_PATH}
xcodebuild clean
xcodebuild -workspace MediaCropper.xcworkspace -scheme MediaCropper -sdk iphonesimulator -arch arm64 > /Users/ch3cooh/works/build_log.txt

アプリの規模にもよるが、build_log.txt にはビルドログが約5000行出力されるだろう。ここからひとつひとつワーニングを目視、または検索していくのは非常に効率が悪い。ビルドログからワーニングを効率的に抽出するために、スクリプトを使用すると楽だろう。

ワーニング抽出スクリプトの作成と実行

iOSアプリ開発ではCocoaPodsを使用しているため、開発者のMacではRubyが使える状態となっているはずである。ワーニング抽出のスクリプトはRubyで書くことにした。このスクリプトはビルドログからワーニング行を抽出し、内容に応じて並び替えて表示する。check_warning.rb というファイル名で保存する。

def process_file(input_file_path, output_file_path)
  lines = []
  
  # ワーニング行の抽出
  File.foreach(input_file_path) do |line|
    lines << line if line.include?('warning:')
  end
  
  # ワーニング内容に応じてソート
  sorted_lines = lines.sort_by do |line|
    warning_index = line.index('warning:')
    line[warning_index..-1]
  end
  
  # 出力
  File.open(output_file_path, 'w') do |file|
    sorted_lines.each { |line| file.puts line }
  end
end

if ARGV.length != 2
  puts "Usage: ruby check_warning.rb <input_file_path> <output_file_path>"
  exit 1
end

input_file_path = ARGV[0]
output_file_path = ARGV[1]
process_file(input_file_path, output_file_path)

以下のコマンドでスクリプトを実行し、ワーニング情報を抽出する。

ruby /Users/ch3cooh/works/check_warning.rb /Users/ch3cooh/works/build_log.txt /Users/ch3cooh/works/build_warning.txt

スクリプトの実行後、build_warning.txt には以下のように種類別にワーニングが並んでいることだろう。

/PATH/CheckVersion/Code4444444.swift:37:1: warning: AAAAAA
/PATH/CheckVersion/Code1111111.swift:37:1: warning: AAAAAA
/PATH/CheckVersion/Code4444444.swift:37:1: warning: AAAAAA
/PATH/CheckVersion/Code3333333.swift:37:1: warning: BBBBBB
/PATH/CheckVersion/Code2222222.swift:37:1: warning: CCCCCC
/PATH/CheckVersion/Code3333333.swift:37:1: warning: CCCCCC

これで、数千行からなるビルドログのうち、関連する情報だけを素早く抽出して、特定の問題に集中できるようになった。同じワーニングが大量に発生している場合、共通のコーディング問題や再利用されているコンポーネントの問題かもしれない。本記事によって、同じ問題の再発を防ぎつつ、開発の効率を向上させることができれば嬉しい。