Swift Package Manager についても拡張が議論されていて、少しづつ充実してきています。
SE-0303 等が順次行われている拡張です。
しばらくするとカスタマイズなしに実現できるようになりそうですが、2022.3 時点では、この記事で書いているような手順が必要です。
Sponsor Link
環境&対象
- macOS Monterey 12.3
- Xcode 13.3
- iOS 15.4
SwiftLint
Swift のコードのコーディングスタイル等をチェックするものです。
SwiftLint のgithubは、こちら。
プロジェクトに適用する
SwiftPackage に適用する前に、まず プロジェクトに適用することが多いと思います。
その方法は、Google すると出てきますので、この記事では説明しません。
事前にプロジェクトに適用して、自分好み(?) の .swiftlint.yml があると便利なのは間違いありません。
SwiftPackageに適用する
SwiftPackage に SwiftLint を適用する方法ですが、こちらのページで公開されている Package を使用します。
ExampleSPMProjectWithSwiftLint
以下の説明は、上記の Package の README にも記述されていますが、動作確認したこともあり、あらためて説明してみます。
SwiftPackage を設定する
Package.swift
上記のパッケージに依存することを(自分で作成しているパッケージの)Package.swift に、追記していきます。targets の中に追加していきます。
.binaryTarget 追加
まず、.binaryTarget を追加します。
// 1. Specify where to download the compiled swiftlint tool from.
.binaryTarget(
name: "SwiftLintBinary",
url: "https://github.com/juozasvalancius/SwiftLint/releases/download/spm-accommodation/SwiftLintBinary-macos.artifactbundle.zip",
checksum: "cdc36c26225fba80efc3ac2e67c2e3c3f54937145869ea5dbcaa234e57fc3724"
),
.plugin 追加
targets の中に、.plugin も追加します。
// 2. Define the SPM plugin.
.plugin(
name: "SwiftLintXcode",
capability: .buildTool(),
dependencies: ["SwiftLintBinary"]
),
.target に追加
最後に、自分の target の dependencies に SwiftLintXcode を追加します。
.target(
name: "SDSCalendarViews",
dependencies: ["SDSViewExtension", "SwiftLintXcode"]),
自分の作成しているパッケージでは、最終的に以下のような Package.swift になりました。(別途必要な SDSViewExtension も dependencies に記述していますが、SwiftLintXcode が必要としているわけではありません。)
// swift-tools-version: 5.6
// The swift-tools-version declares the minimum version of Swift required to build this package.
import PackageDescription
let package = Package(
name: "SDSCalendarViews",
platforms: [
.iOS(.v15),
.macOS(.v12),
],
products: [
// Products define the executables and libraries a package produces, and make them visible to other packages.
.library(
name: "SDSCalendarViews",
targets: ["SDSCalendarViews"]),
],
dependencies: [
// Dependencies declare other packages that this package depends on.
// .package(url: /* package url */, from: "1.0.0"),
.package(url: "https://github.com/tyagishi/SDSViewExtension", .upToNextMajor(from: .init(3, 0, 0)))
],
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: "SDSCalendarViews",
dependencies: ["SDSViewExtension", "SwiftLintXcode"]),
// 1. Specify where to download the compiled swiftlint tool from.
.binaryTarget(
name: "SwiftLintBinary",
url: "https://github.com/juozasvalancius/SwiftLint/releases/download/spm-accommodation/SwiftLintBinary-macos.artifactbundle.zip",
checksum: "cdc36c26225fba80efc3ac2e67c2e3c3f54937145869ea5dbcaa234e57fc3724"
),
// 2. Define the SPM plugin.
.plugin(
name: "SwiftLintXcode",
capability: .buildTool(),
dependencies: ["SwiftLintBinary"]
),
]
)
Plugins/SwiftLinkXcode をコピーする
上記のプラグインに含まれている Plugins/SwiftLintXcode/plugin.swift を自分のプロジェクトのルートフォルダにコピーします。
上記のリポジトリを clone してきてファイルコピーが必要です。
% git clone https://github.com/juozasvalancius/ExampleSPMProjectWithSwiftLint
% cp ExampleSPMProjectWithSwiftLint/Plugins <your project folder>
SwiftLint の実行
上記の設定後に、ビルドすれば、SwiftLint 実行されることになります。
プロジェクトのルートディレクトリの .swiftlint.yml で適用するルールを設定できるのは、通常の SwiftLint と変わりません。
まとめ
SwiftPackage でも SwiftLint を使う方法
- github の ExampleSPMProjectWithSwiftLink を使う
- 上記パッケージの Plugins/SwiftLintXcode/plugin.swift をコピーする
- Pakcage.swift に .binaryTarget, .plugin 設定を行う
- target の dependencies に SwiftLintXcode を追加する
説明は以上です。
不明な点やおかしな点ありましたら、こちらまで。
Sponsor Link