🛠️

Swift PackageのSchemeの法則

2025/03/07に公開

自作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のみ
  • productslibraryが一つでPackageのnameとlibraryのnameが一致している場合
    • Packageのnameのみ
  • productslibraryが一つでPackageのnameとlibraryのnameが一致していない場合
    • Packageのnameのみ
  • productslibraryが二つ以上の場合
    • Packageのnameに-Packageサフィックスがついたものとそれぞれのlibraryのname
  • productslibraryが一つでtargetsexecutableTargetが一つの場合
    • Packageのnameに-PackageサフィックスがついたものとlibraryのnameとexecutableTargetのname
  • productsが空でtargetsexecutableTargetが一つで、PackageのnameとexecutableTargetのnameが一致している
    • Packageのnameのみ
  • productsが空でtargetsexecutableTargetが一つで、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

つまり、法則性をまとめると

  • targetproductslibraryとして含めるとScheme1つ分としてカウントされる
  • executableTargetproductsexecutableとして含めなくてもScheme1つ分としてカウントされる
  • Schemeとしてカウントできるものが1つしかない時はPackage名がSchemeになる
  • Schemeとしてカウントできるものが2つ以上ある時はPackage名に-Packageサフィックスをつけたものと、それぞれのnameがSchemeになる

ということになりそうです。

これを知識として持っているといいことがあるわけではありませんが、-Packageサフィックスがつくのはどういう時なの?と疑問に思ったことがある人は安心してScheme名を指定できるようになるかもしれません。

Discussion