iOS開発環境には重要エコシステムとなるMintの理解と利用

iOS開発環境には重要エコシステムとなるMintの理解と利用

Table of Contents

HomebrewでSwiftLintのバージョンを上げたら、別プロジェクトにも影響与えてコントロール失う経験ありますよね。Mintはそれを解決します。

Mintとは?

Mintは、Swift製コマンドラインツールのパッケージマネージャーです。 ツールのインストールと実行ができます。

同じパッケージマネージャーにHomebrewがあり、そちらのほうが遥かにメジャーです。
Swift製ツールもHomebrewからインストールできますし、
パッケージマネージャーとして使いやすく安定しています。

では「何故Mintがいいのか?Homebrewじゃ駄目なのか?」について説明します。

iOS開発におけるHomebrewが抱える課題

通常はMac1台に複数のiOSアプリやSwiftアプリを開発するはずです。
各プロジェクトでは開発環境に差異あれど、同じツールを使うことは当然ありえます。
同様にそれぞれ使ってるバージョンが異なることも起きます。

しかし、Homebrewは異なるバージョンのツールをバージョン別管理ができません。
そのためツールをバージョンアップすると、各プロジェクトに影響を与え動作しなくなるリスクがあります。

Mintが解決する課題

Mintは、バージョン別管理を可能とし、管轄外のバージョン変更課題を解決します。

Mintでは、Mintfileによりプロジェクト毎にバージョンを管理できます。
これによりPC内の複数プロジェクト間のSwiftツールの疎結合を実現します。

Mintのパッケージ管理方法について

  • バージョン別でパッケージを管理します
  • バージョン指定でパッケージを実行できます
  • パッケージはシンボリックリンクでパスを通してどこからでも実行できます
  • パッケージとバージョンの一覧をMintfileというプレーンテキストで管理できます。

Mintのインストール方法

Homebrewでインストールできます。

$ brew install mint

他にもMake, Mintコード, Swift Package Managerからもインストールできます。

Mintでパッケージをインストールする方法

Mintでパッケージをインストールするにはmint installコマンドを使います。
例えばXcodeGenの最新版をインストールするなら下記になります。

$ mint install yonaskolb/XcodeGen

バージョン指定でインストール

バージョンを指定してインストールするならパッケージ情報の末尾に@x.x.x形式でバージョン情報を渡します。

$ mint install yonaskolb/XcodeGen@1.2.4

パスを通さずインストール

デフォルトではインストールすると/usr/local/binにシンボリックリンクを作成します。
これによりどこからでもアクセスできるようになります。
もしインストールするパッケージをリンクしたくない場合は--no-linkをつけます。

$ mint install yonaskolb/XcodeGen@1.2.4 --no-link

再インストール

--forceオプションをつけることで再インストールできます。

$ mint install yonaskolb/XcodeGen@1.2.4 --force

Mintでパッケージを実行する方法

Mintでインストールしたパッケージを実行するには、mint runコマンドを使います。
例えば最新版のXcodeGengenerateを実行したい場合は下記になります。

$ mint run XcodeGen generate

ちなみに小文字でも動きます。

$ mint run xcodegen generate

バージョン指定で実行

Mintにインストールしてるパッケージが複数バージョンある中で、
リンクしてない古いバージョンを実行する場合は、
バージョン情報をつけることで指定実行できます。

$ mint run xcodegen@1.2.4 generate

Mintfileでパッケージ管理する方法

Mintでは指定のパッケージとバージョンを列挙して一度にインストールしたりアップデートできます。
例えばiOSアプリ開発のGit管理下にMintfileを置くことで、そのレポジトリで使うツールやバージョンを制御することができます。

このMintfileを利用することでプロジェクト間のバージョン差異における干渉を解決します。

Mintfileの書き方

至って簡単です。コマンドラインでインストールや実行するときに指定してる方法と同じです。

Mintfile

yonaskolb/XcodeGen@2.16.0
realm/SwiftLint@0.39.2

Mintfile内のパッケージを使う

そのままmint run xcodegenと実行すれば、インストールされてなければインストールして実行してくれます。 まとめて指定バージョンを予め全部インストールしておきたい場合は、mint bootstrapコマンドを実行します。 mint bootstrapではデフォルトはリンク処理を行いません。
もしリンク処理したい場合はmint bootstrap --linkで実行してください。

注意: Mintfileの有効範囲について

rbenvや.gitignoreなどと異なり、カレントディレクトリ上にMintfileが見つからない場合はバージョン解決はMintfileで行いません。 例えば次のツリー構造のとき、Bディレクトリでmint run xcodegeを実行するとMintfile内のバージョンではなくMintがインストールしてる最新で実行します。

  • Aディレクトリ
    • Mintfile
    • Bディレクトリ

Mintfileのないディレクトリ上でmintコマンドを実行する場合は注意してください。

その他オプション

mintからの出力を止める

--silentオプションを使います。

–silentなし

$ mint run xcodegen version
🌱 Finding latest version of XcodeGen
🌱 Running xcodegen 2.16.0...
Version: 2.16.0

–silentあり

$ mint run --silent xcodegen version
Version: 2.16.0

mintのキャッシュパスとリンク先を変える

MINT_PATHを変更することでインストールしたパッケージの保存場所を変更できます。
デフォルトは/user/local/lib/mintです。

MINT_LINK_PATHを変更するとシンボリックリンクの作成場所を変更できます。
デフォルトは/usr/local/binです。

実際にXcodeプロジェクトに組み込む

SwiftLintを実際に組み込んでみます。
小さいですが一応GitHubにも上げてあります。
git cloneしてmint bootstrapを試してみるのもいいかもしれないです。

HomebrewではBuild Scriptでは

if which swiftlint >/dev/null; then
  swiftlint
else
  echo "warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint"
fi

ですが、

Mint経由でインストールした場合は、

if [[ -f ./Mintfile ]] ; then
  mint run swiftlint
else
  echo "warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint"
fi

と、実行条件とシェルコマンドを変える必要があります。

実行条件はMintfileを見たほうがいい

ネットで見かけた記事では↓のようにmintコマンドの有無でシェルコマンドを実行していましたが、
MintはMintfileがなくても、mint run swiftlintと実行すれば勝手に最新版を取ってきて実行するので、
mintコマンドの有無ではなく、Mintfileの有無のほうが「知らぬ間に最新版で実行してた」を防げると思います。

if which mint >/dev/null; then
  mint run swiftlint
else
  echo "warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint"
fi
このエントリーをはてなブックマークに追加