Posted at

【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