初めに
この記事は Swift Advent Calendar 2019 6 日目の記事です。本来は iPad アプリの Swift Playgrounds について何か書きたかったのですが、結局最近の私のお財布の都合で新しい iPad Pro の購入が断念され、そして所持している iPad が型落ちしすぎて Swift Playgrounds の実行が非常にカクカクするので、テーマを変更してみなさんが今ご覧になっているこの記事になりました。ただここで敢えて一言言っておくなら、今の Swift Playgrounds は本当にとても高機能で結構使える子になってきたのです。確かに iOS アプリの作成とかはできないですが、Mac で作った .playground
ファイルを読み込んでリアルタイムでプレビューができるようになったので勉強会 iPad 持っていけば大体のこと足りるんじゃね?と思うようになりました。
さて、本題に入りましょう。
Mint とは
Mac ユーザ、特に Mac を使うエンジニアなら、Homebrew はとてもお馴染みのあるツールかと思います。Ruby 製のパッケージマネージャーで、Carthage をはじめとした様々な開発に使うツールのインストールを劇的に楽にしてくれるツールです。
そして最近は Mint というパッケージマネージャーが筆者の中で微妙にヒットしています。Mint 自体も Homebrew でインストールできます:
$ brew install mint
Homebrew と Mint の主な違いはこんな感じでしょうか
Homebrew | Mint | |
---|---|---|
自身の言語 | Ruby | Swift |
対象パッケージの言語 | なんでも(特に制限なし) | Swift |
パッケージバージョン指定 | 不可1 | 可能 |
パッケージバージョン指定書式 | -1 | author/Package@version |
パッケージ検索方式 | 別途 tap ファイル | GitHub ユーザ名指定 |
インストール方式 | 別途 tap ファイル | swift ビルド |
単体インストール | brew install Package |
mint install author/Package |
管理ファイルインストール | brew bundle |
mint bootstrap |
管理ファイル | Brewfile | Mintfile |
管理ファイル書式 | brew "Package" |
author/Package |
簡単にまとめてみましたが、一番大きいのは Homebrew は特にツールの言語に制限はないに対し、Mint は Swift 製のツールにしか対応していない;その代わり、Homebrew は必ず独自で tap ファイルを作る必要がある(tap ファイル自体は Homebrew にマージしてもらってもいいですし、マージせずに自分の GitHub リポジトリーに公開するだけでもいいですが、後者の場合利用者は先に自分で手動 tap する必要がある)が、Mint はそもそも GitHub の 著者名/パッケージ名
の書式で探すので、特にツール以外の追加外部ファイルは必要ないという利便さがある感じですかね;何よりこの tap ファイルは非常に面倒で、ビルドコマンドだけでなく、最新リリースのアーカイブを取得する URL 及びそれの sha-256 ハッシュも書かなくてはいけないです。
また、Homebrew は特定のバージョンに指定するという機能がない(常に最新版をインストールする)1に対し、Mint は特定のバージョンをインストールできるという点も人やプロジェクトによっては大きなメリットなのかもしれません。
というわけで、こんな Mint ですが、せっかくなのでぜひご自分で作った Swift 製のツールを Mint 対応してみてはいかがでしょうか?
じゃあどう対応するの?
実は Mint の対応はとても簡単です:SwiftPM に対応すれば終わり!これだけです。
え?と思うかもしれませんが、本当にそうです。自分が作ったツールを SwiftPM に対応させれば、それで終わりなのです。
なんのことか微妙にわかりにくいかもしれませんので、ここは私が作ったランダム文字列の生成ツール hanako の Mint 対応 を例に解説してみましょう。
-
最初の最初に、ターミナルでリポジトリーのルートパスに遷移して、
$ swift package init
して、$ swift package generate-xcodeproj
をします(もちろん.xcodeproj
ファイルが既にあってもswift package generate-xcodeproj
をする必要があります)。これでとりあえずこのリポジトリー自体が SwiftPM の対応ができます。このステップの実行結果はこちらのコミットになります。差分が大きいですが、内容は全部自動生成です。 -
SwiftPM 対応によって
Sources
とTests
のディレクトリーが作成されます(もし既存の作りがこうなっていなかった場合)。前者はプログラム本体のソースコードの置き場で、後者はユニットテストのコードの置き場です。なのでもし既存のソースコードがSources
内になかった場合、それらのコードをSources
内に持っていきましょう。これを対応したのがこちらのコミットです。 -
実は 1. の段階で SwiftPM の自動生成によって作られた
Package.swift
ファイルはちょっと問題があります。そのまま実行するとライブラリーとしてみられちゃいますが、我々が作ってるツールはターミナルで実行されるプログラムですので、products
の項目の.library(
の行を.executable(
に修正します。この対応がこちらのコミットになります。 -
最後に、また 1. の段階で自動生成された .xcodeproj ファイルでは、余計な Scheme や target が生成されたりしますので、そこらへんの設定を確認しておきましょう;もし何か間違ったものがあったらそれらを直しましょう。これを対応したのがこの二つのコミットです。
-
ここまでできたら Mint 対応ができているはずなので、一旦 GitHub にこのブランチをあげておきましょう;そしてこれで Mint の便利さもまさにここで体験できます:とりあえずターミナル行って、
$ mint install myName/myToolName@branchName
で一回やってみると、実際 Mint を使って今あげたブランチを落としてきてインストールを試みるので、これで本当に Mint の対応ができたかどうかが確認できます;もしここで何か問題あったら、エラー読んで対応しましょう。 -
せっかく Mint 対応できたんだから、README.md ファイルとか CHANGELOG.md ファイルとかでアピールしましょう!これを対応したのがこちらのコミットです。
ね、簡単でしょ?
しかも Homebrew との比較で書いたとおり、Mint は別途のリリース説明を担当する tap ファイルが要らないので、バージョンアップとかする際も普通に GitHub でバージョンリリースのタグ打ちするだけで済むから非常に手軽です。
宣伝
せっかくここまで書きましたので、hanako のインストールも宣伝しておきますね:
$ mint install el-hoshino/hanako
利用イメージはだいたいこんな感じです:
mymac:~ me$ mint install el-hoshino/hanako
🌱 Finding latest version of hanako
🌱 Cloning hanako v1.0.4
🌱 Resolving package
🌱 Building package
🌱 Installed hanako v1.0.4
🌱 Linked hanako v1.0.4 to /usr/local/bin
mymac:~ me $ hanako
Generated string: zGlv4EDJPQ
Result has been copied to your clipboard, you can use cmd + v to paste it.
余談
hanako のコードベースが非常に古いので今絶賛リファクタリング中です…w