概要
- 自作のSwift Packageの開発中にSwiftLintを利用するため、
Swift Lint Plugins
を導入していきます
GitHub
Package.swiftの設定
- 公式のREADMEの通り
Swift Lint Plugins
をPackage.swift
へ記載します
- ただこのまま導入するとパッケージの依存関係に
Swift Lint Plugins
が含まれることになります - このパッケージを利用するアプリ側の
Swift Lint Plugins
と衝突したり、GitHub Actionsのubuntu
を利用する際にビルドエラーとなる問題がでてきます - その解決策として、下記のようにPackage内で環境変数を
ProcessInfo.processInfo.environment[key]
でチェックして、Swift Lint Plugins
を利用するかを制御させることができます
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
で設定できます(今回はしない)
pr-ci.yml
env:
SWIFTLINT: true
ローカルでSwift Pacakgeを開発する際にSwiftLint Pluginsを有効化する
- ローカルでSwfit Pacakgeを編集する際に、先程の環境変数を設定させたいです
- これが少し手間なのですが、現状下記のようにXcodeを開く際に設定して伝播させる必要があるようです
KITURA_NIO=1 open Package.swift -a Xcode
- なお参考の記事にもある通り
Environment Variables
はうまく動作しないようでした - (パッケージはビルドするだけで、デバイスで動かすわけではないからでしょうか)
- 一例として
Package.swift
と同じ階層に、下記のようなシェルスクリプトを作って起動できるようにしておくと便利かなと思いました
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