Swift Package追加時にUp to Next Major versionが機能していない理由

2022.04.29

XcodeでSwift Package追加時にUp to Next Major versionが機能していなかったのでその原因を調べました。

環境

  • Xcode 13.3

Up to Next Major versionとは

パッケージ要件として設定できるルールの一つ。このルールを設定することで指定したメジャーバージョン未満の範囲の中で最も新しいパッケージバージョンに更新することが出来ます。

Swift Packageでのバージョニングはセマンティックバージョニング仕様に準拠する必要があります。セマンティックバージョニングについては過去に調べて記事にしました。

バージョン表記の各数字の意味をイラストで理解する

メジャーバージョンはマイナーバージョンよりも重要な変更が加えられる傾向がある為、更新時にコードを変更する必要がある場合があります。Up to Next Major versionまでの更新にしておくことでより安全にSwift Packageを利用することが出来ます。

同じようにUp to Next Minor versionというルールもあり、こちらは指定したマイナーバージョン未満の最も新しいバージョンで更新します。

なぜ、Up to Next Major versionが機能しないのか

Publishing a Swift Package with XcodeTag Your Latest Commitで下記のように記述されています。

パッケージバージョンは、1.0.0のようなピリオドで区切られた3つの整数です。開発者がパッケージの依存関係を新しいバージョンに更新したときにパッケージが予測可能な方法で動作するように、パッケージバージョンはセマンティックバージョニングに準拠する必要があります。

Swift Packageでのバージョニングはセマンティックバージョニング仕様に準拠する必要があるのですが、今回Up to Next Major versionが機能しなかったライブラリのバージョンタグを確認すると、v2.1.1のようにバージョン番号を示すvが付いていました。

セマンティック バージョニング 2.0.0のQ&Aを引用すると、

『v1.2.3』はセマンティック バージョンでしょうか?

 いいえ、『v1.2.3』はセマンティック バージョンではありません。しかしながら、セマンティック バージョンに接頭辞の『v』を付けるのは英語ではバージョン番号であることを示す一般的な方法です。バージョン管理では、『バージョン』を『v』と略すことがよくあります。たとえば git tag v1.2.3 -m" Release version 1.2.3 " では『v1.2.3』はタグ名であり、セマンティック バージョンは『1.2.3』です。

v1.2.3はタグ名であり、セマンティックバージョンではない為、Swift Package Managerが予測可能になっていませんでした。

解決方法

実際にUp to Next Major versionが機能しなかったライブラリをクローンして、タグ名に沿って、新規にセマンティックバージョニングでバージョンタグを付与すると正常に機能するようになりました。

しかし、これだと自分がクローンしたものでは正常に機能しましたが、実際のライブラリの方では反映されていません。issueとしてお伝えすると喜んでもらえます。

おわりに

実は今回初めてOSSにissueを出してみたのですが、喜んでもらえて嬉しかったです。issueを出す行為を難しく考えていたのですがこのように軽い気持ちで出せることが分かりました。もし、OSSで不具合や改善点を見つけたら積極的にissueを出したり、可能であればコントリビュートしていきたいと感じました。

また自分でSPMを作成する時は、利用者の為にもセマンティックバージョンに準拠したバージョニングを行おうと思います。

参考