XcodeプロジェクトとXcodeワークスペース-相違点


402

エコシステム全体がどのように機能するかを理解しようとしていますiOS
今までのところ、ほとんどの質問に対する答えを見つけることができました(そして私を信じてください、たくさんあります)。しかし、これについては、まだ明確な答えはないようです。

XcodeProjectファイルとXcodeWorkspaceファイルの違いは何ですか?

  1. それらの2つの違いは何ですか?
  2. 彼らは何の責任がありますか?
  3. チーム/単体でアプリを開発する場合、どちらを使用すればよいですか?
  4. これら2つのファイルに関して他に注意する必要があることはありますか?

回答:


606

プロジェクト構造について理解する必要がある3つの重要な項目があると思いますターゲットプロジェクトワークスペースです。ターゲットは、製品/バイナリ(つまり、アプリケーションまたはライブラリ)の構築方法を詳細に指定します。これらには、コンパイラやリンカーのフラグなどのビルド設定が含まれ、実際に製品に属するファイル(ソースコードとリソース)を定義します。ビルド/実行するときは、常に1つの特定のターゲットを選択します。

コードとリソースを共有するターゲットがいくつかある可能性があります。これらの異なるターゲットは、アプリのわずかに異なるバージョン(iPad / iPhone、異なるブランディングなど)またはアプリと同じソースファイルにアクセスする必要があるテストケースである可能性があります。これらの関連するターゲットはすべて、プロジェクトにグループ化できます。プロジェクトにはすべてのターゲットからのファイルが含まれていますが、各ターゲットは関連するファイルの独自のサブセットを選択します。ビルド設定についても同じことが言えます。プロジェクト全体でデフォルトのプロジェクト全体の設定を定義できますが、ターゲットの1つに異なる設定が必要な場合は、いつでもそこでオーバーライドできます。

上書きしない限り、すべてのターゲットが継承する共有プロジェクト設定

オーバーライドしない限り、すべてのターゲットが継承する共有プロジェクト設定

具体的なターゲット設定:PSE iPhoneはプロジェクトのベースSDK設定を上書きします

具体的なターゲット設定:PSE iPhoneはプロジェクトのBase SDK設定を上書きします

Xcodeでは、常にプロジェクト(またはワークスペースではなくターゲット)を開き、それに含まれるすべてのターゲットをビルド/実行できますが、プロジェクトをビルドする方法/定義はないため、すべてのプロジェクトには少なくとも1つのターゲットが必要です。ファイルと設定の単なるコレクションではありません。

実行するプロジェクトのターゲットの1つを選択します

実行するプロジェクトのターゲットの1つを選択します

多くの場合、プロジェクトで十分です。ソースからビルドする依存関係がある場合、それをサブプロジェクトとして埋め込むことができます。サブプロジェクトは、個別に、またはスーパープロジェクト内で開くことができます。

demoLibはサブプロジェクトです

demoLibはサブプロジェクトです

サブプロジェクトのターゲットの1つをスーパープロジェクトの依存関係に追加すると、変更されていない限り、サブプロジェクトは自動的にビルドされます。ここでの利点は、プロジェクトと依存関係の両方のファイルを同じXcodeウィンドウで編集できることと、ビルド/実行するときに、プロジェクトとそのサブプロジェクトのターゲットから選択できることです。

サブプロジェクトからターゲットを実行する

ただし、ライブラリ(サブプロジェクト)が他のさまざまなプロジェクト(または正確にはそのターゲット)で使用されている場合は、同じ階層レベルに配置するのが理にかなっています。それがワークスペースの目的です。ワークスペースはプロジェクトを含み、管理します。ワークスペースに直接含まれるすべてのプロジェクト(つまり、サブプロジェクトではない)は同じレベルにあり、それらのターゲットは相互に依存できます(プロジェクトのターゲットはサブプロジェクトのターゲットに依存できますが、その逆はできません)。

ワークスペースの構造

ワークスペースの構造

この例では、両方のアプリ(AnotherApplication / ProjectStructureExample)がdemoLibを参照できますプロジェクトのターゲットを。これは、demoLibプロジェクトを他の両方のプロジェクトにサブプロジェクトとして含めることによっても可能です(これは参照のみであるため、複製は不要です)。相互依存関係が多数ある場合は、ワークスペースの方が理にかなっています。ワークスペースを開くと、ビルド/実行時にすべてのプロジェクトのターゲットから選択できます。

ワークスペースからターゲットを実行する

プロジェクトファイルを個別に開くことはできますが、ワークスペースファイルを開かないとXcodeが依存関係を解決できないため、ターゲットがビルドされない可能性があります。ワークスペースは、サブプロジェクトと同じ利点を提供します。依存関係が変更されると、Xcodeはそれを再構築して最新であることを確認します(いくつかの問題がありましたが、確実に機能しないようです)。

一言で言えばあなたの質問

1)プロジェクトには、ファイル(コード/リソース)、設定、およびそれらのファイルと設定から製品を構築するターゲットが含まれます。ワークスペースには、相互に参照できるプロジェクトが含まれています。

2)どちらもプロジェクト全体の構成を担当しますが、レベルは異なります。

3)ほとんどの場合、プロジェクトで十分だと思います。特別な理由がない限り、ワークスペースは使用しないでください。さらに、後でいつでもプロジェクトをワークスペースに埋め込むことができます。

4)それが上記のテキストの目的です…

3)には1つの注意点があります。CocoaPodsは、サードパーティのライブラリを自動的に処理し、ワークスペースを使用します。したがって、CocoaPods(多くの人が使用しているように)使用するときも、それらを使用する必要があります。


7
1つのプロジェクトを2つの別々のワークスペースの一部にすることはできますか?または、1つのプロジェクトを他の2つのプロジェクトと共有したい場合、それらすべてを同じワークスペースの一部にする必要がありますか?
ジャック

8
絶対に、プロジェクトは必要な数のワークスペースの一部になることができます。ワークスペースにプロジェクトを追加しても、プロジェクト自体については何も変更されません。したがって、多くのオプションがあります...すべて1つのワークスペース、1つのプロジェクトを共有する2つのワークスペース、またはサブプロジェクトとして共有プロジェクトを持つ2つのプロジェクト。
ハギ

1
私はそれについての経験はありませんが、READMEには、「プロジェクトの構造と設定を完全に制御できる」、および「[依存関係]を単一のワークスペースに統合する代わりに[...]依存関係を含める必要があります独自のXcodeプロジェクト」。つまり、プロジェクトやワークスペースにはまったく影響を与えないので、どのように回答に含めればよいのかわかりません。Carthageを使用する場合、特に依存関係の構造化方法を決定する必要があるため、答えは依然として役立ちますが、Carthageに固有のものはありません。

プロジェクト階層についてよく説明しました。場所からサブプロジェクトを削除/移動すると、サブプロジェクトはメインプロジェクトに残りますか?stackoverflow.com/questions/40214505/…
ガネーシュGuturi

親プロジェクトファイルには、コピーではなくサブプロジェクトへの参照があります。サブプロジェクトが削除されると、親はそれを見つけることができなくなります。通常、ファイルシステムレベルで、親プロジェクトにそのすべてのサブプロジェクトのローカルコピーがあることを確認します。CocoaPodsやCarthageなどの依存関係マネージャーがそれを行うか、gitサブモジュールを使用できます。
萩2016年

103

ワークスペースはプロジェクトのコレクションです。プロジェクト間に相関関係がある場合は、プロジェクトを整理すると便利です(例:プロジェクトAには、プロジェクトBとしてプロジェクト自体として提供されるライブラリが含まれています。ワークスペースをビルドすると、プロジェクトBがコンパイルされ、プロジェクトAでリンクされます)。
一般的なCocoaPodsではワークスペースを使用するのが一般的です。ポッドをインストールすると、ポッドはプロジェクトとポッドライブラリを保持するワークスペース内に配置されます。


35

簡単に

  • Xcode 3では、親子関係であるサブプロジェクトが導入されました。つまり、親は子ターゲットを参照できますが、その逆はできません
  • Xcode 4では、兄弟関係であるワークスペースが導入されました。つまり、どのプロジェクトでも同じワークスペース内のプロジェクトを参照できます。

2

CocoaPodsを使用してiOSプロジェクトを開発したとき、.xcworkspaceファイルがあります.xcworkspace。CocoaPodsに関連するファイルでプロジェクトを開く必要があります。

ファイルのプレビュー

しかし、ときにShow Package Contents持つ.xcworkspaceファイル、あなたは見つけるでしょうcontents.xcworkspacedata、ファイルを。

パッケージ内容

<?xml version="1.0" encoding="UTF-8"?>
<Workspace
   version = "1.0">
   <FileRef
      location = "group:BluetoothColorLamp24G.xcodeproj">
   </FileRef>
   <FileRef
      location = "group:Pods/Pods.xcodeproj">
   </FileRef>
</Workspace>

この行に注意してください:

location = "group:BluetoothColorLamp24G.xcodeproj"

.xcworkspaceファイルが持つ参照持つ.xcodeprojファイルを。

開発環境:

macOS 10.14
Xcode 10.1

2
  1. それらの2つの違いは何ですか?
    ワークスペースはプロジェクトのセットです

  2. 彼らは何の責任がありますか?
    プロジェクトはソースコードを担当します。ワークスペースはプロジェクト間の依存関係を担当します

  3. チーム/単独でアプリを開発する場合、どちらを使用すればよいですか?
    どちらを選択するかは、プロジェクトのタイプによって異なります。たとえば、プロジェクトがCocoaPods依存関係マネージャーに依存している場合、ワークスペースが作成されます。

  4. これらの2つのファイルに関して他に知っておくべきことはありますか?
    ワークスペースのライバルはcross-project references【概要】

[Xcodeコンポーネント]

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.