🛠️
Swift PackageのSchemeの法則
自作Swift PackageのテストをCI上で動かそうとする時、xcodebuildコマンドでSchemeを指定することになります。(swiftコマンドだとdestinationを指定できないため、特定プラットフォームに依存したライブラリの場合はxcodebuildコマンドを使うことになります。)
SchemeはPackage.swiftファイルがあるルートでxcodebuild -listを実行すれば一覧が確認できます。
$ xcodebuild -list
中略
Information about workspace "LicenseList":
Schemes:
LicenseList
LicenseList-Package
spp
ただ、このScheme名がSwift Packageの作り方によって異なる命名になることがあるなと気づいたため、法則を調査しました。
xcodebuild -listで見つかるSchemes
-
productsが空の場合- Packageのnameのみ
-
productsにlibraryが一つでPackageのnameとlibraryのnameが一致している場合- Packageのnameのみ
-
productsにlibraryが一つでPackageのnameとlibraryのnameが一致していない場合- Packageのnameのみ
-
productsにlibraryが二つ以上の場合- Packageのnameに
-Packageサフィックスがついたものとそれぞれのlibraryのname
- Packageのnameに
-
productsにlibraryが一つでtargetsにexecutableTargetが一つの場合- Packageのnameに
-PackageサフィックスがついたものとlibraryのnameとexecutableTargetのname
- Packageのnameに
-
productsが空でtargetsにexecutableTargetが一つで、PackageのnameとexecutableTargetのnameが一致している- Packageのnameのみ
-
productsが空でtargetsにexecutableTargetが一つで、PackageのnameとexecutableTargetのnameが一致していない- Packageのnameのみ
表にすると以下のようになります。
| products | executableTarget | Schemes |
|---|---|---|
| 空 | なし | PackageName |
| library 1つ | なし | PackageName |
| library 2つ | なし | PackageName-Package LibraryName1 LibraryName2 |
| 空 | あり | PackageName |
| library 1つ | あり | PackageName-Package LibraryName ExecutableName |
つまり、法則性をまとめると
-
targetはproductsにlibraryとして含めるとScheme1つ分としてカウントされる -
executableTargetはproductsにexecutableとして含めなくてもScheme1つ分としてカウントされる - Schemeとしてカウントできるものが1つしかない時はPackage名がSchemeになる
- Schemeとしてカウントできるものが2つ以上ある時はPackage名に
-Packageサフィックスをつけたものと、それぞれのnameがSchemeになる
ということになりそうです。
これを知識として持っているといいことがあるわけではありませんが、-Packageサフィックスがつくのはどういう時なの?と疑問に思ったことがある人は安心してScheme名を指定できるようになるかもしれません。
Discussion