SwiftLintをSwiftPMで導入する

今回は SwiftPM で SwiftLint を導入する記事を書いていこうと思います。

本記事の内容は Github にも上がっているので、参考にしてみてください。

https://github.com/tbskgm0/SwiftLintFromSwiftPM

# 実装


### workspaceの追加
今回は複数の .xcodeproj を使用するので、 xcworkspace を追加します。
メニュバーの File > New > Workspace... で追加することができます。

workspace を開いても何も表示されませんが、すでに作成してある .xcodeproj をドラッグ&ドロップすれば表示させることができます。
※表示されない場合は開き直してください。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409860/ec638aee-d467-0b5f-4472-17e7c1506882.png)


### package の追加
メニュバーから File > New > Package... から追加することができます。

![スクリーンショット 2023-03-19 16.42.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409860/b4e5186e-7d9e-1aee-4ce7-fa770b52c552.png)

特に名前に指定はありませんが、`BuildTools` というパッケージ名にします。
Add to と group にはそれぞれ作成したプロジェクトを選択します。


### Package の編集
BuildTools の Package.swift を開いて、SwiftLint を追加します。
```diff_swift: Package.swift
import PackageDescription

let package = Package(
    name: "BuildTools",
    products: [
        // Products define the executables and libraries a package produces, and make them visible to other packages.
        .library(
            name: "BuildTools",
            targets: ["BuildTools"]),
    ],
    dependencies: [
        // Dependencies declare other packages that this package depends on.
        // .package(url: /* package url */, from: "1.0.0"),
+        .package(url: "https://github.com/realm/SwiftLint.git", branch: "main")
    ],
    targets: [
        // Targets are the basic building blocks of a package. A target can define a module or a test suite.
        // Targets can depend on other targets in this package, and on products in packages this package depends on.
        .target(
            name: "BuildTools",
            dependencies: []),
        .testTarget(
            name: "BuildToolsTests",
            dependencies: ["BuildTools"]),
    ]
)
```


### RunScriptの設定
画像を参考に Run Script を追加します。
![スクリーンショット 2023-03-19 18.36.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409860/e01d65bf-bcef-720e-634a-18f07e04f066.png)


※パッケージ名を BuildTools にしていない方は、設定したパッケージ名に修正してください。

```:Run Script
xcrun --sdk macosx swift build -c release --package-path BuildTools

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

./BuildTools/.build/checkouts/SwiftLint/.build/release/swiftlint lint --config $SRCROOT/.swiftlint.yml
```


:::note info
RunScript に書かれている内容がわからない時は、ChatGPT に質問してみると理解につながることになると思います。
:::

[こちら](
https://zenn.dev/kyome/articles/c9e812ed7a11e8)の記事のスクリプトを ChatGPT3.5 にコピペした結果このようになりました。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409860/ab629743-1990-af58-5ca6-3800787a42bf.png)

### .swiftlint.yml の追加

```:terminal
touch .swiftlint.yml
```

[SwiftLint の Github](https://github.com/realm/SwiftLint/blob/main/.swiftlint.yml)からコピペします。
ただし、コピペだけでは動かないので、以下の部分を修正します。

```diff_yaml:.swiftlint.yml
included:
-  - Plugins
-  - Source
-  - Tests
+ ${TARGET_NAME}

// 省略
```


### swiftlintの警告を発生させる

次は意図的に警告を発生させるために`ContentView.swift`を以下のように編集します。

```diff_swift:ContentView.swift
- struct ContentView: View {
+ struct ContentView : View {
      var body: some View {
          VStack {
              Image(systemName: "globe")
                  .imageScale(.large)
                  .foregroundColor(.accentColor)
              Text("Hello, world!")
          }
          .padding()
      }
  }
```

Command + B または Command + R を実行すれば、以下の警告が表示されるはずです。
`Colons should be next to the identifier when specifying a type and next to the key in dictionary literals (colon)`

これで SwiftLint を SwiftPM で導入することができました。

# 参考リンク

https://qiita.com/akatsuki174/items/cd54e739ceec7cdbb8ef

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

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

https://qiita.com/uhooi/items/c1f829b115165665d2a5

https://qiita.com/shtnkgm/items/6dd756aa14926736c6f5