🚀

Package.swiftに対するRenovateのライブラリ自動更新の仕様を理解する

2023/12/12に公開

はじめに

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