iOS その3 Advent Calendarの9日目の記事です。
最近、NGワード一覧みたいなのを定義しておいたらコンパイル時にそれがコード中に含まれていないかチェックして含まれてたらビルド落ちるように出来ないかな〜とか思って試してみた。
XcodeのBuild phaseの中でSwiftLintを使うと、warning/errorのある行をXcodeが黄色とか赤にハイライトしてくれるやつ、どうやってるのかなーと思っていろいろ見てみると
/path/to/file:line:何文字目か(?): error: ほげほげ
このフォーマットでエラー出力にprintして、非0なexit statusを返せばXcodeがハイライトしてくれるらしいということがわかった。
"register"を"regist"と間違えて書いてある奴を許せないので、registという単語を使っている行をビルドエラーにするツールをPerlでさくっと書いた。
#!/usr/bin/perl use strict; use warnings; my $current = `pwd`; chomp($current); my $root = "."; my $filelist = &get_files($root); my $status = 0; foreach my $file (@$filelist) { my @lines = split("\n", `cat $file`); my $i = 1; foreach my $line (@lines) { if ($line =~ /[rR]egist[^e]/) { print STDERR "$current/$file:$i:1: error: Registという英単語はない💢😡\n"; $status = 2; } $i++; } } exit($status); sub get_files { my $dir = shift; my $filelist = shift; opendir(DIR, "$dir"); my @list = grep /^[^\.]/, readdir DIR; foreach my $file (@list) { if (-d "$dir/$file") { $filelist = &get_files("$dir/$file", $filelist); } else { if ($file =~ /.swift$/) { push @$filelist, "$dir/$file"; } } } return $filelist; }
XcodeのRun script phaseに
perl regist.pl
と追加してやると、コード中にあるregistの行で
エラーとしてハイライトしてくれるようになった。
今後はもっと汎用的なNG単語フィルターツールとしてもうちょっと拡張したい。
iOSのアドベントカレンダーなのにPerlしか書いて無くてすみませんでした。