iOS開発でも未使用コードを検知したい

3 min read読了の目安(約2700字

概要

どのプロジェクトでもどこからも参照されていないコードが1つや2つあるのではないかと思います。
そしてこの数が増えるにつれノイズが多くなるので、見たいコードが見づらくなるので開発の効率が落ちてしまいます。

そもそも実装者が使用していないコードをコミットするな、と思うかもしれませんが実装者も人なので気づかずにコミットしてしまうことがあります。そしてレビューワーも未使用コードに気づかずにApproveしてしまうこともあると思います。

そこで本記事ではPeripheryというCLIパッケージを用いて未使用コードを検知する方法と、CIビルドにおいて未使用コードがあればPull Requestに未使用コード箇所をコメントする方法を述べていきます。

使用するCLIツール

  • mint (Swift製パッケージ管理ツール. 今回は説明を省略します.)
  • Periphery
  • Danger

Periphery

Peripheryとは、未使用コードを分析するSwift製のツールです。

https://github.com/peripheryapp/periphery

Peripheryのセットアップ

Peripheryのインストール方法は複数ありますが、今回はMintを使用してインストールします。

1. Mintfileを生成し、以下を追記します。

peripheryapp/periphery@2.3.1

2. mint bootstrapでインストールします。

Danger

Dangerは、Pull Requestに対して事前に決めたルールに則ってAuto Reviewしてくれるツールです。
事前に決めたルールとは、「Pull Requestの差分は500まで」や「Lintのルールに則っているか」などです。

Dangerのセットアップ

1. bundlerをインストールする(必須ではないが、bundlerを使ったほうが管理しやすい。)

gem install bundler

2. Gemfileを生成する

bundle init

3. Gemfileに以下を追記する

gem "danger"

4. Dangerをインストールする

bundle install --path .bundle/

.bundle/は.gitignoreに追記してgit管理しないほうが良いです。

5. GemfileとGemfile.lockをコミットする

6. Danger公式ページを参考にPull RequestにBotユーザーがコメントできるようにします。

未使用コードを分析する

私は以下2つのスクリプトを作成してPeripheryを実行し、その結果を解析するようにしました。

run_unused_code.sh
DIR="report"
if [ ! -d $DIR ]; then
  mkdir $DIR
fi

mint run periphery scan --project xxx.xcodeproj --targets ターゲット名 --schemes スキーム名 --format "xcode" > report/unused_code_report.txt
parse_unused_code_report.rb
Dir.mkdir('report') unless Dir.exist?('report')

system('bash Scripts/Bitrise/run_unused_code.sh')

warnings = []

File.open('report/unused_code_report.txt', mode = 'rt') do |f|
  f.each_line(rs='') do |line|
    warnings.push(line.chomp(rs='')) 
  end
end

File.open('report/parsed_unused_code_report.txt', mode = 'w') do |f|
  f.write(warnings[1])
end

Dangerfileは以下のようにします。

Dangerfile
File.open("report/parsed_unused_code_report.txt").each do |warnings|
  warnings.split("\n").each do |warning|
    warn(warning)
  end
end

あとはCIビルドで上記スクリプトを実行します。今回はBitriseでの実行を想定しているので、bitrise.ymlに以下を追記します。

steps:
- script@1:
    inputs:
    - content: |-
        gem install bundler
        bundle config set path '.bundle/'
        bundle install
    title: Bundle install
- script@1:
    inputs:
    - content: 'ruby parse_unused_code_report.rb '
    title: Output unused code
- script@1:
    inputs:
    - content: bundle exec danger --verbose
    title: Run danger

すると以下のように未使用コードがあるとPull Requestに以下のような感じでコメントしてくれます。

まとめ

簡単に未使用コードを検知することができるので、是非導入してみてください!