Swift Package
WWDC19 で Swift Package Manager の機能が Xcode に統合されたことが発表され、ついに iOS のライブラリも Swift Package Manager で導入することができるようになりました。
https://developer.apple.com/videos/play/wwdc2019/410
https://developer.apple.com/videos/play/wwdc2019/408
※ beta 版の内容を含むため、以降の内容は今後結果が変わる可能性があります。この投稿は Xcode 11 beta 6 の動作に基づきます。
Swift Package として作った iOS ライブラリをコマンドでテストしたい
CIサービスなどでテストを動かすために、テストをコマンドで実行したい時があると思います。
今までの SPM プロジェクトであれば、下記のコマンドで実行できました。
$ swift test
しかし、iOS ライブラリを SPM で作った場合は、うまくいかないケースがあります。
上記のコマンドは macOS で動かした場合、 macOS プラットフォームのプロジェクトとして認識されるため、UIKit
のような macOS では使えないフレームワークを利用している場合、ビルドエラーになってしまいます。
xcodebuild を使う
Swift Package として作成した iOS のプロジェクトには .xcodeproj ファイルがありませんが、 xcodebuild
コマンドでテストを動かすことができました。
$ xcodebuild -scheme <パッケージ名> test -destination "name=iPhone XS" | xcpretty
scheme にはパッケージ名を指定します。 $ xcodebuild -list
で名前を確認できます。
Bitrise で動かす
現時点では Bitrise はまだ Swift Package を認識してくれませんが、 Bash スクリプトを動かせるので Workflow に Script のステップを追加して、以下のスクリプトを書くとテストを動かせます。 (マニュアルセットアップする必要があります)
#!/usr/bin/env bash
# fail if any commands fails
set -e
set -o pipefail
# debug log
set -x
rm -rf *.xcodeproj
xcodebuild -scheme <パッケージ名> test -destination "name=iPhone XS" | xcpretty
現状ではライブラリを Carthage にも対応させるために .xcodeproj ファイルを swift package generate-xcodeproj
で作成して、commit しておく必要があります。
しかし .xcodeproj ファイルがあると、 xcodebuild
コマンドが Swift Package のパッケージ名を認識してくれなくなる問題があるようです。
そのため、 .xcodeproj を一旦削除してから、 xcodebuild
を動かす必要があります。
まとめ
iOS の Swift Package プロジェクトでは、 swift test
ではなく、 xcodebuild
でテストを動かしましょう。
(今後、 swift test
でもうまくいくようになりそうな気はしてます)