SwiftPackageManagerでつまずいたこと

こんにちは。デスクワークで腰痛が悪化し続けているあおいです。

SwiftPackageManagerに関してつまずいたことがあったのですが、解決策書いてる記事が殆ど無かったのでメモしておきます。

SwiftPackageManager とは

SwiftPackageManager(以下SwiftPM)とは、Swiftのソースコードで構成されたパッケージを、依存関係の解決やバージョン管理をしつつ利用できるようにしてくれるパッケージ管理ツールです。

以前はコマンドラインからの実行のみ可能でしたが、Xcode11以降はXcodeに統合され、iOSアプリのプロジェクトでもSwiftPMのパッケージが利用できるようになりました。

つまずいたポイント

SwiftPMで作ったパッケージをコマンドラインから

$ swift test

でテストを実行すると以下のエラーが出ました。

'dispatchPrecondition(condition:)' is only available in macOS 10.12 or newer

Xcodeから実行したテストは通ってるし、実行してるPC自体のOSはとっくにmacOS10.12より新しいのにどういうことだろう…

となったので、オープンソースであるSwiftPMのソースコードの中身を詮索してみました。

すると以下の記述を発見。

github.com

特に指定しない場合、macOSのターゲットバージョンは勝手に10.10にされてしまうようですね。

ここで挙がったdispatchPrecondition(condition:)のターゲットSDKはmacOS10.12以上なので、macOS10.10では動かんよということみたいです。

以下のオプションを足してターゲットを上書きすることで成功しました。

$ swift test -Xswiftc "-target" -Xswiftc "x86_64-apple-macosx10.12"

対称のパッケージがmacOSをサポートしてるなら、Package.swiftのplatformにmacOSバージョンを指定してあげても成功します。

あ、ちなみに、iOS向けのライブラリとかで利用するときにplatformにiOSのみを指定しても、swiftコマンドによる実行は必然的にmacOS上でのビルドになります。

詰まるところmacOS向けでないものはswiftコマンドでのビルド・テストはする必要はないのかも。



それにしてもこの最低バージョンが強制的に指定されるのには何か理由があるのでしょうか…

せめてPackage.swiftにmacOS以外の設定がされてる場合はそもそもビルドされないの方が嬉しいかもしれません。

このあたり気になるのでもう少し実装みてみようかなと思います。

このへん詳しい方は是非教えて下さい🙏