モバイルアプリエンジニア向け、便利CLIツール作成のススメ

これははてなエンジニアAdvent Calendar 2018 4日目のエントリです。
昨日は id:onishiプロジェクト計画について思うことでした。

こんにちは!Developer Blog大臣の id:yutailang0119 です。
今年の2月入社なので、はてなエンジニアのアドベントカレンダーは初参加です!

本題

私はアプリケーションエンジニアですが、その中でも特にモバイルアプリ開発をメインで担当しています。
モバイルアプリエンジニアはXcodeやAndroid Studioなどを使う時間が圧倒的に長く、GUIでの操作に慣れていて、CUIでの操作は避けられている印象があります。
このエントリでは、私が作った3つのCLIツール作成の動機を解説しつつ、モバイルアプリエンジニアがCLIツール作成のきっかけになり、便利ツールが増えることの一助になればと思っています。

1. Xcodeのキャッシュデータを消すの不便じゃないですか?

Xcodeのキャッシュは、PCの容量を大きく消費します。
その中でも、

  • Archives
  • DerivedData
  • DeviceSupport

といったファイルは、ことさら大容量なものが多いです。*1
一部はXcodeのショートカットキーで消すことも可能ですが、目的別に使い分けるのは少々ハードルが高いのではないでしょうか。

ということで、CLIを作りました。

github.com

使い方はとても簡単で、ArchivesDerivedDataは1コマンドで削除できます。

$ xccache-sweeper archives
$ xccache-sweeper deriveddata
$ xccache-sweeper caches // 上記両方を削除

DeviceSupportは対話式に削除できるようになっています。

$ xccache-sweeper devicesupport
Which do you want to delete? Please select index
iOS
 0: iOS/11.2.5 (15D60)
 1: iOS/11.4 (15F79)
 2: iOS/11.4.1 (15G77)
 3: iOS/12.0 (16A366)
 4: iOS/12.0.1 (16A404)
 5: iOS/12.1 (16B92)
watchOS
 6: watchOS/Watch3,3 4.3.2 (15U70)
 7: watchOS/Watch3,3 5.0 (16R364)
 8: watchOS/Watch3,3 5.0.1 (16R381)
 9: watchOS/Watch3,3 5.1.1 (16R600)

Goの勉強も兼ねていたので、試行錯誤しながらとなりましたが、概ね満足のできるものになっています。

2. xcprojectやxcworkspaceファイルが散在して、探すのが大変じゃないですか?

主にXcodeで開くであろう拡張子は

  • .xcodeproj
  • .xcworkspace
  • .playground

と多く、普段からmotemen/ghqpeco/pecoを使っていても、ディレクトリ名だけではXcodeのプロジェクトファイルの所在がわからないことがあります。

ということで、CLIを作りました。

github.com

$ xcopen open -p {$PATH}
$ xcopen list -p {$PATH}

その名の通り、Xcodeで開くためのコマンドopenとXcode向け拡張子ファイルを探索するコマンドlistの2つからなります。
用途は、listで探索しつつ、openで開くということを想定しています。
xcopenと言いつつ、自分のメインの使い方はlistの使用が多いですね。

これはSwift製なので、モバイルアプリエンジニアがCLIツールを作るためのサンプルにおすすめです!
Swift Package Managerの理解も深まるでしょう!

XcodeやAndroid Studioでプロジェクトを開く時、GUIで操作していませんか?

私はVisual Studio Code (VSCode) もよく使います。
VSCodeには、codeというCLIが付属しています。
私も多くの機能は使いこなせていませんが、ファイルをVSCodeで開く機能は、非常に便利に使っています。

$ code {$FILE}

特に $ code . でカレントプロジェクトごとVSCodeで開く機能を使わない日はありません。
openコマンドは便利ですが、Xcodeはまだしも、Android Studioはaオプションでアプリケーションを毎回指定する必要があり、非常に面倒です。

$ open XcodeProject.xcproject
$ open AndroidProjectDir -a Android\ Studio

ということで、XcodeとAndroid Studio向けのツールを作りました。
私は普段fish shellを使っているので、今回はfish functionとして作ることで楽をしてみました。

xcode.fish

gist.github.com

studio.fish

gist.github.com

$ xcode XcodeProject.xcproject
$ studio AndroidProjectDir

codeを模した方法で使用でき、aオプションでインストールされているXcodeとAndroid Studioそれぞれのデフォルトバージョン以外も指定できるようにしています。
Xcodeの方はxcopenとかぶる部分がありますが、共存できないものではないので、dotfilesを持っていくだけで済むこれも便利だと思っています。

おまけ: 副産物

xcopenを作った副産物で、Swift製CLI用のProgress Spinnerライブラリを作りました。

github.com

汎用化して、切り出す。
我ながら、とてもいいムーブ。

まとめ

いかがだったでしょうか?
今回の例は全く仰々しいものではなく、少しでも楽をしようとした結果から生み出されているものだということが伝われば幸いです。
特にfish functionのレベルのものは、30分もあれば作ることが可能です。
日頃GUIツールに慣れ親しんでいる方も、ちょっとしたものからCLIツールとして作ってみると、生活が豊かになるかもしれません!
毎日やることだからこそ、楽をして生きていきましょう!!!

明日は id:stefafafan です!

*1:CIでビルドを回すなど、ローカルでxcarchiveをしない場合はArchivesは溜まらないかもしれません