背景
2024/2/2に mobile.stmn #4 という名古屋のモバイルアプリ開発勉強会で、Swiftでのアプリ開発に必要な各種CLIツールもSwiftPMに寄せる話をしました。
しかし、このタイミングの SwiftLint 0.54 ではCommandプラグインが提供されておらず、--fix
機能での自動修正をSwiftPM経由でできませんでした。そこで、やむなく次のようなスクリプトで運用していたのですが、それがとても心残りでした(「完結編」と言ったのに完結していない...)。
cd ${PACKAGE_DIR} && swift package resolve
cd ${PACKAGE_DIR}/.build/checkouts/SwiftLint && \
swift run swiftlint --config ${PACKAGE_DIR}/.swiftlint.yml --fix
SwiftLint 0.55リリース
SwiftLint 0.54のリリースから約半年経過したこの2024年5月に、新バージョン 0.55 がリリースされました。そしてこのバージョンで待望のCommandプラグインが提供されました。
SwiftLintをインストールしているPackageディレクトリで以下のコマンドによりSwiftLintを実行することができます。もちろん--fix
オプションなど各種パラメータを指定可能なので、この方法で自動修正も行えるようになります。
swift package plugin swiftlint
--fix
オプションを使う場合は、pluginのオプションに--allow-writing-to-package-directory
を追加してファイルへの書き込みを許可しておこう!
注意点①:Build Toolプラグインの名前が変わった
Commandプラグイン提供に伴い、従来から提供されているBuild Toolプラグインの名前が変わったので、Package.swiftの修正が必要となります。
- .plugin(name: "SwiftLintPlugin", package: "SwiftLint")
+ .plugin(name: "SwiftLintBuildToolPlugin", package: "SwiftLint")
注意点②:Build ToolプラグインのConfigファイルの参照方法が変わった
Build Toolプラグインにはパラメータ等を指定することができません。そこで SwiftLint 0.54 ではREADMEで以下のような説明がされており、Configファイル .swiftlint.yml
はルートディレクトリにあるものが参照されるようになっていました。
Due to limitations with Swift Package Manager Plug-ins this is only
recommended for projects that have a SwiftLint configuration in their root directory as
there is currently no way to pass any additional options to the SwiftLint executable
それが今回のバージョン 0.55 では、次のような説明に変わっており、ビルド方法によって参照されるConfigファイルの場所が変わっていますので注意してください。
The build tool plugin determines the SwiftLint working directory by locating
the topmost config file within the package/project directory. If a config file
is not found therein, the package/project directory is used as the working
directory.
Xcodeプロジェクトをビルドする場合
- Xcodeプロジェクトファイルのディレクトリ配下にあるConfigファイルのうち、最上位にあるもののディレクトリがワーキングディレクトリとなり、そのConfigファイルが参照される
- つまり、基本的にはXcodeプロジェクトファイルと同じ位置に配置しておくのが良さそう
Swiftパッケージをビルドする場合
- パッケージディレクトリ配下にあるConfigファイルのうち、最上位にあるもののディレクトリがワーキングディレクトリとなり、そのConfigファイルが参照される
- つまり、基本的にはPackage.swiftファイルと同じ位置に配置しておくのが良さそう
まとめ
SwiftLint 0.55でSwiftPM Commandプラグインに対応したことで、私の「iOSパッケージマネージャ奮闘記」が本当に完結しました!めでたい