🛠️
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