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