自作のSwift Packageにおいて、開発時にだけSwift Lint Pluginsを有効化にする

## 概要
- 自作のSwift Packageの開発中にSwiftLintを利用するため、`Swift Lint Plugins`を導入していきます

## GitHub

- [pommdau/ikeh-github-api-client](https://github.com/pommdau/ikeh-github-api-client)

## Package.swiftの設定

- 公式のREADMEの通り`Swift Lint Plugins`を`Package.swift`へ記載します
    - 参考: [realm/SwiftLint: A tool to enforce Swift style and conventions.](https://github.com/realm/SwiftLint?tab=readme-ov-file)

![](https://i.imgur.com/f1n50DH.jpeg)

- ただこのまま導入するとパッケージの依存関係に`Swift Lint Plugins`が含まれることになります
- このパッケージを利用するアプリ側の`Swift Lint Plugins`と衝突したり、GitHub Actionsの`ubuntu`を利用する際にビルドエラーとなる問題がでてきます
- その解決策として、下記のようにPackage内で環境変数を`ProcessInfo.processInfo.environment[key]`でチェックして、`Swift Lint Plugins`を利用するかを制御させることができます
    - 参考: [Server-Side SwiftでSwiftLintのpluginとSwift buildを両立する方法](https://zenn.dev/nextbeat/articles/70b9a6b85a1ca3)

```swift:Package.swift
// swift-tools-version: 6.0
// The swift-tools-version declares the minimum version of Swift required to build this package.
/*
 refs: 
 [Server-Side SwiftでSwiftLintのpluginとSwift buildを両立する方法](https://zenn.dev/nextbeat/articles/70b9a6b85a1ca3)
 https://forums.swift.org/t/swiftpm-and-swappable-libraries/43593
 */


import Foundation
import PackageDescription

let package = Package(
    name: "IKEHGitHubAPIClient",
    platforms: [
        .iOS(.v17),
        .macOS(.v15)
    ],
    products: [
        .library(
            name: "IKEHGitHubAPIClient",
            targets: ["IKEHGitHubAPIClient"]),
    ],
    dependencies: dependencies,
    targets: [
        .target(
            name: "IKEHGitHubAPIClient",
            dependencies: [
                .product(name: "HTTPTypes", package: "swift-http-types"),
                .product(name: "HTTPTypesFoundation", package: "swift-http-types"),
            ],
            swiftSettings: swiftSettings,
            plugins: swiftLintPlugins,
        ),
        .testTarget(
            name: "IKEHGitHubAPIClientTests",
            dependencies: ["IKEHGitHubAPIClient"],
            swiftSettings: swiftSettings,
            plugins: swiftLintPlugins,
        ),
    ]
)

// MARK: - Helpers

var dependencies: [Package.Dependency] {
    var dependencies: [Package.Dependency] = [
        .package(url: "https://github.com/apple/swift-http-types", from: "1.3.1"),
    ]
    if Environment.enableSwiftLintPlugins {
        dependencies.append(
            .package(url: "https://github.com/SimplyDanny/SwiftLintPlugins", from: "0.1.0"),
        )
    }
    return dependencies
}

var swiftSettings: [SwiftSetting] {
    return [
        .enableExperimentalFeature("StrictConcurrency"),
    ]
}

var swiftLintPlugins: [Target.PluginUsage] {
    if Environment.enableSwiftLintPlugins {
        return [
            .plugin(name: "SwiftLintBuildToolPlugin", package: "SwiftLintPlugins")
        ]
    }
    return []
}

/// GitHub上では.github/workflows/swiftlint.yamlのenvで指定する
/// 本PackageではXcodeの起動時に引数を渡すことで指定する
enum Environment {
    static func get(_ key: String) -> String? {
        return ProcessInfo.processInfo.environment[key]
    }
    static var enableSwiftLintPlugins: Bool {
//        return true
        Self.get("ENABLE_SWIFTLINT_PLUGINS") == "true"
    }
}
```

- なおGitHub Actions上で環境変数を設定したい場合は`env`で設定できます(今回はしない)

```yml:pr-ci.yml
env:
  SWIFTLINT: true
```

## ローカルでSwift Pacakgeを開発する際にSwiftLint Pluginsを有効化する

- ローカルでSwfit Pacakgeを編集する際に、先程の環境変数を設定させたいです
- これが少し手間なのですが、現状下記のようにXcodeを開く際に設定して伝播させる必要があるようです
    - 参考: [SwiftPM and swappable libraries? - Using Swift - Swift Forums](https://forums.swift.org/t/swiftpm-and-swappable-libraries/43593)

> ```sh
> KITURA_NIO=1 open Package.swift -a Xcode
> ```

- なお参考の記事にもある通り`Environment Variables`はうまく動作しないようでした
- (パッケージはビルドするだけで、デバイスで動かすわけではないからでしょうか)

![](https://i.imgur.com/QkoJyEE.jpeg)

- 一例として`Package.swift`と同じ階層に、下記のようなシェルスクリプトを作って起動できるようにしておくと便利かなと思いました

```sh:open_package_with_env.command
#!/bin/zsh

# ⚠️ 環境変数を設定するために、Xcodeを閉じた状態で本コマンドを起動してください
# refs: https://forums.swift.org/t/swiftpm-and-swappable-libraries/43593

# スクリプトが存在するディレクトリに移動
cd "$(dirname "$0")"

# 環境変数を設定してからXcodeでPackage.swiftを開く
## SwiftLint-Pluginsを有効にする
export ENABLE_SWIFTLINT_PLUGINS=true

open Package.swift
```