Mintをプロジェクトディレクトリにインストールする


# はじめに
Swift製コマンドラインツールのMintですが、複数のプロジェクトで使用されているビルドマシンにインストールせずにプロジェクトディレクトリ内にインストールし、プロジェクトごとに管理する様にしてみました。

# Mintとは
<a href="https://github.com/yonaskolb/Mint">![mint_logo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/952058/ef94e284-fa51-ff89-9d60-b160a10baa76.png)</a>
https://github.com/yonaskolb/Mint  

Swift製コマンドラインツールのインストールと実行を行うパッケージマネージャーです。
以下の様なパッケージを管理できます。

- XcodeGen
- SwiftLint
- SwiftGen
- Carthage
- LicensePlist

普通にインストールした場合は、
packageは`/usr/local/lib/mint`にインストールされ、
packageをbuildしたcommandのリンクは`/usr/local/bin`にインストールされます。

# プロジェクトディレクトリにインストール
MintのREADME.mdによると、以下の環境変数でインストール先を指定できるという事なのでこれらを使用します。

- `MINT_PATH` :  packageのインストール先ディレクトリ
- `MINT_LINK_PATH` :　packageをbuildしたcommandのリンクのインストール先ディレクトリ

### 1. Mintのディレクトリを作成しクローンする
プロジェクトディレクトリ内にMint用のディレクトリを作成しその中にクローンします。

```
$ mkdir mint
$ tree
.
├── Mintfile
└── mint

1 directory, 1 file
$ cd mint
$ git clone https://github.com/yonaskolb/Mint.git
Cloning into 'Mint'...
remote: Enumerating objects: 36, done.
remote: Counting objects: 100% (36/36), done.
remote: Compressing objects: 100% (28/28), done.
remote: Total 1952 (delta 10), reused 17 (delta 6), pack-reused 1916
Receiving objects: 100% (1952/1952), 357.89 KiB | 669.00 KiB/s, done.
Resolving deltas: 100% (1113/1113), done.
$  cd ..
$ tree
.
├── Mintfile
└── mint
    └── Mint
        ├── CHANGELOG.md
        ├── LICENSE
        ├── Makefile
        ├── Package.resolved
        ├── Package.swift
        ├── README.md
        ├── Sources
        │   ├── Mint
        │   │   └── main.swift
(一部省略)
10 directories, 42 files
```

### 2. パスを指定してインストール
`MINT_PATH`, `MINT_LINK_PATH`を指定してインストールする

```
$ cd mint/Mint
$ export MINT_PATH="../lib" MINT_LINK_PATH="../bin"
$ swift run mint install yonaskolb/mint
Fetching https://github.com/jakeheis/SwiftCLI.git
(一部省略)
[70/70] Linking mint
🌱 Finding latest version of mint
🌱 Cloning mint 0.16.0
🌱 Resolving package
🌱 Building package
🌱 Installed mint 0.16.0
🌱 Linked mint 0.16.0 to /Users/User_Name/projects/mint_test/mint/bin
$ cd ../..
$ tree
.
├── Mintfile
└── mint
    ├── Mint
    │   ├── CHANGELOG.md
 (一部省略）
    ├── bin
    │   └── mint -> /Users/User_Name/projects/mint_test/mint/lib/packages/github.com_yonaskolb_mint/build/0.16.0/mint
    └── lib
        ├── metadata.json
        └── packages
            └── github.com_yonaskolb_mint
                └── build
                    └── 0.16.0
                        └── mint

16 directories, 45 files
```

### 3. シンボリックリンクを変更
上のログを確認してもらうと`mint/bin/mint`のリンクが絶対パスになっているのが分かると思います。
ビルドマシンなどで実行できなくなるので、これを相対パスに変更します。

```
$ cd mint/bin
$ export mint_bin_path=$(find ../lib/packages/github.com_yonaskolb_mint/build/*/mint)
$ ln -sf $mint_bin_path mint
$ tree
.
└── mint -> ../lib/packages/github.com_yonaskolb_mint/build/0.16.0/mint
```

### 4. Packagesをインストール
Mintfileに設定してあるpackageをインストールします。

```
$ export MINT_PATH="mint/lib" MINT_LINK_PATH="mint/bin"
$ mint/bin/mint bootstrap
🌱 Cloning SwiftLint 0.41.0
🌱 Resolving package
🌱 Building package
🌱 Installed SwiftLint 0.41.0
🌱 Cloning XcodeGen 2.18.0
🌱 Resolving package
🌱 Building package
🌱 Copying resources for XcodeGen: SettingPresets ...
🌱 Installed XcodeGen 2.18.0
🌱 Installed 2/2 packages
$ mint/bin/mint run xcodegen --version
Version: 2.18.0
```

# シェルスクリプト
`MINT_PATH`, `MINT_LINK_PATH`を指定してインストールしたり実行するのが面倒なのでシェルスクリプトを作成しました。
https://github.com/yd2x/mint_sh

##### 使用方法：

```
$ tree
.
├── Mintfile
├── mint
└── mint.sh

1 directory, 2 files

[インストール]
$ sh mint.sh --install    

[packageインストール]
$ sh mint.sh bootstrap

[package実行]
$ sh mint.sh run xcodegen
```

# References
- [Mintについて調べてみた](https://note.com/ryokosuge/n/n5d55aa584405)