0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Last updated at Posted at 2025-05-15

概要

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

GitHub

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
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?