Xcode
iOS

【Xcode】xcodeprojとxcworkspaceの違いについて本気出して考えてみた

これは?

タイトルの通りです。

xcworkspace = 複数のxcodeprojを取りまとめられるもの

と自分は考えていたのですが、 xcodeproj自身がxcodeprojを持つことも実はできるし、いまいち違いがわからなくなってきたので備忘録として。

Target

XcodeのProjectには少なくともひとつ Target がありますね。
Targetとは、ビルドの結果得られる生成物のことで、iOS, watchOS, OSXなどがあります。

そして、どのTargetも build settings があり、ビルドするときは必ずいずれかのTargetを選択する必要があります。

SampleProject_xcodeproj01.png

Project (.xcodeproj)

iOSやwatchOSなど複数Targetsをグループ化するのが Project です。
Targetのベースとなる設定はProjectの build settings で行い、Target固有の設定はそれぞれのTarget内の build settings でやる感じです。

XcodeはProjectを開き、Targetをビルドする、ということですね。

SampleProject_xcodeproj02.png

Subproject

Projectの中に他のProjectを Subproject として組み込むことができます。
Subprojectはそれ単体で開くことも、親プロジェクト内で開くこともできます。

親ProjectをビルドすればSubprojectもビルドが走ります(ビルドキャッシュ機構が動作するので、次に差分が生じるまでリビルドも生じません)。

同じXcodeのウィンドウからどちらのProjectも編集でき、Targetも選択可能です。

SampleSubproject_xcodeproj03.png

Workspace (.xcworkspace)

複数のProjectを同じレベルで束ねることができるのが Workspace です。
PackegeMangerにCocoapodsを使用している場合はよく見ると思います。

AnotherSampleProject_xcodeproj.png

xcodeproj vs xcworkspace

以上のことから、使い分けとしては以下のようになります。

  • 1つのメインプロジェクトがあり、そこからの参照しかない場合は Subproject として組み込む
  • 複数のプロジェクトからの依存がある場合、 Workspace として束ねる

参考

https://developer.apple.com/jp/documentation/ToolsLanguages/Conceptual/Xcode_Overview/CreatingApps/WorkingwithTargets.html
https://stackoverflow.com/questions/21631313/xcode-project-vs-xcode-workspace-differences