[Xcode][SwiftPM] SwiftPackage に SwiftLint を適用する

SwiftPackageManagerEyeCatch

     
SwiftPackage として作った環境で SwiftLint を実行させる方法を説明します。
MEMO
Swift Package Manager についても拡張が議論されていて、少しづつ充実してきています。

SE-0303 等が順次行われている拡張です。
しばらくするとカスタマイズなしに実現できるようになりそうですが、2022.3 時点では、この記事で書いているような手順が必要です。

環境&対象

以下の環境で動作確認を行なっています。

  • 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 を使う方法

SwiftPackage でも SwiftLint を使う方法
  • github の ExampleSPMProjectWithSwiftLink を使う
  • 上記パッケージの Plugins/SwiftLintXcode/plugin.swift をコピーする
  • Pakcage.swift に .binaryTarget, .plugin 設定を行う
  • target の dependencies に SwiftLintXcode を追加する

説明は以上です。
不明な点やおかしな点ありましたら、こちらまで。

コメントを残す

メールアドレスが公開されることはありません。