🔮
SwiftFormatを使って、ビルド時にコードを自動フォーマットする(SPM)
はじめに
SPM(Swift Package Manager)を使用し、Xcodeのビルド時にSwiftFormatを実行してコードのインデントや空白を自動で整える方法をメモとして残します。
注意:この方法を実行するとXcodeの「戻る(Undo)」履歴がリセットされ、ビルド前の状態には戻れなくなる。公式では、ユニットテストの実行時などにフォーマットすることが薦められています。
XCode16.0を使用した方法となります。
手順
手順1: パッケージ(BuildTools)の作成
1-1. 新規 Swift Package を作成
- Xcode を開き、メニューから
File → New → Package...
を選択 - テンプレートは
Multiplatform → Empty
- パッケージ名は
BuildTools
とし、作成場所はプロジェクト直下を指定 -
Don't add to any project or workspace
のままで作成 - 自動作成された
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 を作成
-
Cmd + N
で新規SwiftFileを作成 -
Empty.swift
という名前でBuildTools
フォルダ内に保存(ファイルの中身は空のままでOK)
このファイルがないと、SPMのターゲットが空になり、エラーが発生する
手順2: Xcodeの設定変更
2-1. ENABLE_USER_SCRIPT_SANDBOXING を無効化
- Xcodeのプロジェクト設定を開く
-
Build Settings
タブを開く -
ENABLE_USER_SCRIPT_SANDBOXING
をfilterで検索し、Noに設定
この設定を変更しないとエラーになってスクリプトの実行ができなかった(XCode15以降で必須みたい)
手順 3: ビルド時に毎回実行されるスクリプトを追加
3-1. スクリプトを追加
-
Build Phases
タブを開く -
左上の「+」ボタンを押して
New Run Script Phase
を追加
-
以下のスクリプトを記述する
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 を参照すると矢印がつくようになったっぽい
表示上の違いだけで、動作には問題なさそう
参考:
Discussion