Package.swiftに対するRenovateのライブラリ自動更新の仕様を理解する
はじめに
Renovateとは複数のプラットフォームと言語に対応した、ライブラリ自動更新ツールです。
iOS開発におけるパッケージ管理ツールであるSwift Package Manager(SwiftPM)にも対応しています。
ライブラリ自動更新とは言いますが、実際どのようにしてSwiftPMのバージョン等を判断しているのでしょうか?
本記事では、RenovateがSwiftPMのバージョン認識する方法を解説します。
前提
この記事では
- パッケージ管理にPackage.swiftを使用していること
- 既にRenovate.jsonを導入方法がわかっていること
を前提としており、これらについてはこの記事中では解説しません。
Package.swiftでのライブラリバージョン指定
Package.swift内で外部ライブラリへの依存を記述する際には
.package(
url: "https://example.com/example-package.git",
from: "1.2.3"
),
のように書くことが多いかと思います。
上記の例で書いたfrom: "1.2.3"
の部分では依存先のライブラリのバージョンを指定しているのですが、この部分は複数の書き方があり、いくつか抜粋して紹介します。
from: Version
.package(url: "https://example.com/example-package.git", from: "1.2.3"),`
.package(url: "https://example.com/example-package.git", .upToNextMinor(from: "1.2.3")),
fromで指定したバージョン(1.2.3)から次のマイナーアップデート(1.3.0)までがPackage.resolvedで指定されることがあります。
ClosedRange<Version>
.package(url: "https://example.com/example-package.git", "1.2.3"..."1.2.6"),
1.2.3から1.2.6までがPackage.resolvedで指定されることがあります。
exact: Version
.package(url: "https://example.com/example-package.git", exact: "1.2.3"),
1.2.3のみがPackage.resolvedで指定されます。
バージョンが明確で一番わかりやすく思えますが、依存関係グラフで競合が発生する可能性があり、お勧めできないと明言されています。package(url:exact:)
ここまでバージョンは"1.2.3"のように文字列で書いてきましたが、実はこの部分はVersionという型で、次のように置き換えることもできます
- Version("1.2.3")
- Version(1, 2, 3)
Renovateが認識できるバージョン指定方法
上記のようにPackage.swift上でバージョン指定をする書き方をいくつか紹介しました。
Renovateではもちろん全ての書き方に対応しています。
...と言いたいところですが、中に一つだけ更新することのできない書き方がありました(2023/12/11現在)。それが以下です。
Version(1, 2, 3)
Renovateがどのようにバージョンを認識しているかはRenovateのGitリポジトリを見てみるとわかります。
Package.swiftの中を正規表現で検索しており、次の形を一塊としてバージョンと認識しているようです。
from: "1.2.3"
"1.2.3"
"1.2.3"...
"1.2.3"..<
..."4.5.6
..<"4.5.6
"1.2.3"..."4.5.6"
"1.2.3"..<"4.5.6"
v1.2.3
v1.2.3
等、いくつかPackage.swiftでは使用できない形式が混じっていますね?何故でしょうか。
まあそれはとりあえず置いておいて、
上記のようにバージョンの文字列を見ているので、Version("1.2.3")
やexact("1.2.3")
のような指定方法でも"1.2.3"
部分を見て更新ができるようになっています。意外と力技ですね。
最後に
いかがでしたでしょうか。
大抵の人には役に立たない内容だったかとは思いますが、↑の罠に引っかかっている一部の方(自分含む)の助けにはなるかもな記事でした。
ちなみにRenovateはオープンソースなので修正のPR出せるんですよね。時間があればコントリビュートチャレンジしてみようと思います。
Discussion