🔮

SwiftFormatを使って、ビルド時にコードを自動フォーマットする(SPM)

2025/03/13に公開

はじめに

SPM(Swift Package Manager)を使用し、Xcodeのビルド時にSwiftFormatを実行してコードのインデントや空白を自動で整える方法をメモとして残します。
注意:この方法を実行するとXcodeの「戻る(Undo)」履歴がリセットされ、ビルド前の状態には戻れなくなる。公式では、ユニットテストの実行時などにフォーマットすることが薦められています。

https://github.com/nicklockwood/SwiftFormat#xcode-build-phase
当記事では、上のリンクの中のビルド時に毎回フォーマットする方法を記述します。
XCode16.0を使用した方法となります。

手順

手順1: パッケージ(BuildTools)の作成

1-1. 新規 Swift Package を作成

  1. Xcode を開き、メニューから File → New → Package... を選択
  2. テンプレートは Multiplatform → Empty
  3. パッケージ名は BuildTools とし、作成場所はプロジェクト直下を指定
  4. Don't add to any project or workspaceのままで作成
  5. 自動作成されたPackage.swiftが開かれる

1-2. Package.swiftを編集

作成されたPackage.swiftを以下の内容で上書きする:

Package.swift
// swift-tools-version:5.1
import PackageDescription

let package = Package(
    name: "BuildTools",
    platforms: [.macOS(.v10_11)],
    dependencies: [
        .package(url: "https://github.com/nicklockwood/SwiftFormat", from: "0.55.0"),
    ],
    targets: [.target(name: "BuildTools", path: "")]
)

1-3. Empty.swift を作成

  1. Cmd + Nで新規SwiftFileを作成
  2. Empty.swiftという名前でBuildToolsフォルダ内に保存(ファイルの中身は空のままでOK)
    このファイルがないと、SPMのターゲットが空になり、エラーが発生する

手順2: Xcodeの設定変更

2-1. ENABLE_USER_SCRIPT_SANDBOXING を無効化

  1. Xcodeのプロジェクト設定を開く
  2. Build Settingsタブを開く
  3. ENABLE_USER_SCRIPT_SANDBOXINGをfilterで検索し、Noに設定
    この設定を変更しないとエラーになってスクリプトの実行ができなかった(XCode15以降で必須みたい)

手順 3: ビルド時に毎回実行されるスクリプトを追加

3-1. スクリプトを追加

  1. Build Phasesタブを開く

  2. 左上の「+」ボタンを押してNew Run Script Phaseを追加

  3. 以下のスクリプトを記述する

cd BuildTools
SDKROOT=(xcrun --sdk macosx --show-sdk-path)
#swift package update #Uncomment this line temporarily to update the version used to the latest matching your BuildTools/Package.swift file
swift run -c release swiftformat "$SRCROOT"

こんな感じになる

3-2. ビルドしてみる

Before After

整った!!
手順は以上です。

メモ:仕様変更による影響

BuildToolsのアイコンに矢印がつく現象

Finder から BuildTools の Package.swift を開くと、Xcode上で「矢印アイコン(エイリアスのような表示)」 がつく
以前XCode15で同じ手順で同じ方法で作ったパッケージには矢印が付いていない

XCode16 XCode15以前

また、XCode16の場合であっても、BuildTools がプロジェクト内にあると矢印はつかない
Xcode の仕様変更により、プロジェクト外の Swift Package を参照すると矢印がつくようになったっぽい
表示上の違いだけで、動作には問題なさそう

参考:
https://zenn.dev/kyome/articles/7b55ac35c1b9a6

Discussion