【Swift】SwiftLintをSwiftPMで管理する

# はじめに
昨日はSwiftFormatをSwiftPMで管理するについて書きました。

https://qiita.com/SNQ-2001/items/c56658193d54c040c1fb

今日はSwiftLintをSwiftPMで管理できるようにしてみたいと思います。

「swiftpm-sample」というプロジェクトを作成しました。
ここにSwiftLintをいれてみます。
![スクリーンショット 2023-01-13 21.33.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/a3503e16-383e-0bd1-d42b-d009bca7058d.png)

# やりかた
### 各種ファイルを設定
swiftpm-sampleに移動します。
```:ターミナル
cd /Users/miyamototaishin/Desktop/swiftpm-sample
```
![スクリーンショット 2023-01-13 21.40.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/31941a14-edfe-37c4-d7fa-4421f9b93bf2.png)

BuildToolsというフォルダを作成します。
```:ターミナル
mkdir BuildTools
```
![スクリーンショット 2023-01-13 21.41.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/304ceeee-15dd-c844-e46d-fa57f8007759.png)

BuildToolsに移動します。
```:ターミナル
cd BuildTools
```
![スクリーンショット 2023-01-13 21.41.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/049b4850-38a5-942c-07a2-0574eac832f1.png)

`Package.swift`を作成します。
```:ターミナル
touch Package.swift
```
![スクリーンショット 2023-01-13 21.42.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/391291b2-ba00-4767-8991-8c5df60886ee.png)

`Empty.swift`を作成します。
```:ターミナル
touch Empty.swift
```
![スクリーンショット 2023-01-13 21.42.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/aebd33f6-5bb1-2f04-957c-e819958ba510.png)

`Package.swift`を開きます。
```:ターミナル
open Package.swift
```
![スクリーンショット 2023-01-13 21.43.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/9ceb28f7-3e08-4b42-2b44-9ba7c0492941.png)

`Package.swift`に以下をコピペします。
```Package.swift
// swift-tools-version: 5.6
import PackageDescription

let package = Package(
    name: "BuildTools",
    dependencies: [
        .package(url: "https://github.com/realm/SwiftLint.git", branch: "main")
    ],
    targets: [.target(name: "BuildTools", path: "")]
)
```

ディレクトリを１つ上の階層に移動します。
```:ターミナル
cd ..
```
![スクリーンショット 2023-01-13 21.45.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/a5255a0e-e762-e1ae-d198-70853dbce901.png)

`.swiftlint.yml`を作成します。
```:ターミナル
touch .swiftlint.yml
```
![スクリーンショット 2023-01-13 21.55.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/703173c0-6507-5bfd-1f67-d84f3be76207.png)

`.swiftlint.yml`を開きます。
```:ターミナル
open .swiftlint.yml
```
![スクリーンショット 2023-01-13 21.55.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/577c2d5b-7d0c-41ac-47e7-05a33f75fce5.png)

.swiftlint.ymlを編集します
他にもたくさんルールがあるので[公式のルール一覧](https://realm.github.io/SwiftLint/rule-directory.html)を見てください
```.swiftlint.yml
# チェック対象ファイル
included:
- ${TARGET_NAME}
```

### Run Scriptを作成
プロジェクトをダブルタップで開きます。
![スクリーンショット 2023-01-13 21.57.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/236d7c18-f9ff-f9f4-b192-f3f127dc3447.png)

① プロジェクトを選択します
② ターゲットを選択します
③ 「Build Phases」を選択します
④ 「+」を選択します
![スクリーンショット 2023-01-13 21.59.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/36e6cff2-0aa7-d4aa-4aed-ef70b2e21925.png)

⑤ 「New Run Script Phase」を選択します
![スクリーンショット 2023-01-13 22.00.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/365b4826-f6b8-8552-1925-d66957cd4ebc.png)

追加された「Run Script」に以下のスクリプトをコピペします。
```sh
cd BuildTools

xcrun --sdk macosx swift build -c release
```
![スクリーンショット 2023-01-15 20.47.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/1c06f195-e643-c73b-79d5-b3acd3f5ef23.png)

先ほどと同じ手順でRun Scriptを作成します。
作成したRun Scriptに以下のスクリプトをコピペします。
```sh
cd BuildTools

xcrun --sdk macosx swift build -c release \
--package-path .build/checkouts/SwiftLint \
--product swiftlint

.build/checkouts/SwiftLint/.build/release/swiftlint lint --config $SRCROOT/.swiftlint.yml
```
![スクリーンショット 2023-01-16 20.13.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/e9f2fb2f-a884-6228-442b-111be466bd7c.png)

### ビルド
ビルドします。
![スクリーンショット 2023-01-13 22.48.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/0bcec03f-fb83-6783-2b35-7d8766635992.png)

エラー出ました！！！
エラーが出てこんなに嬉しいことは他にないですね！
![スクリーンショット 2023-01-13 22.42.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/d3bc9b17-9b6e-20d2-a8c2-1131b89eb2f5.png)

# 詰まった点
branch指定でmainを選択しないとなぜかできない
```swift
⭕️ .package(url: "https://github.com/realm/SwiftLint.git", branch: "main")
❌ .package(url: "https://github.com/realm/SwiftLint.git", version: "0.50.0")
❌ .package(url: "https://github.com/realm/SwiftLint.git", from: "0.50.0")
```

# 参考記事
https://github.com/realm/SwiftLint/issues/3073

https://zenn.dev/kyome/articles/c9e812ed7a11e8