Xcode-Projekt vs. Xcode-Arbeitsbereich - Unterschiede


402

Ich versuche zu verstehen, wie das gesamte Ökosystem iOSfunktioniert.
Bis jetzt konnte ich für die meisten meiner Fragen eine Antwort finden (und vertraue mir, es gab viele davon), aber für diese scheint es noch keine klare Antwort zu geben.

Was ist der Unterschied zwischen XcodeProject- und XcodeWorkspace-Dateien?

  1. Was ist der Unterschied zwischen den beiden?
  2. Wofür sind sie verantwortlich?
  3. Mit welchem ​​von ihnen sollte ich arbeiten, wenn ich meine Apps im Team / alleine entwickle?
  4. Gibt es noch etwas, das ich in Bezug auf diese beiden Dateien beachten sollte?

Antworten:


606

Ich denke, es gibt drei Schlüsselelemente, die Sie in Bezug auf die Projektstruktur verstehen müssen: Ziele , Projekte und Arbeitsbereiche . Ziele geben detailliert an, wie ein Produkt / eine Binärdatei (dh eine Anwendung oder Bibliothek) erstellt wird. Sie enthalten Build-Einstellungen wie Compiler- und Linker-Flags und definieren, welche Dateien (Quellcode und Ressourcen) tatsächlich zu einem Produkt gehören. Beim Erstellen / Ausführen wählen Sie immer ein bestimmtes Ziel aus.

Es ist wahrscheinlich, dass Sie einige Ziele haben, die Code und Ressourcen gemeinsam nutzen. Diese unterschiedlichen Ziele können leicht unterschiedliche Versionen einer App (iPad / iPhone, unterschiedliche Brandings usw.) oder Testfälle sein, die natürlich auf dieselben Quelldateien wie die App zugreifen müssen. Alle diese verwandten Ziele können in einem Projekt gruppiert werden . Während das Projekt die Dateien aller seiner Ziele enthält, wählt jedes Ziel seine eigene Teilmenge der relevanten Dateien aus. Gleiches gilt für Build-Einstellungen: Sie können projektweite Standardeinstellungen im Projekt definieren. Wenn jedoch eines Ihrer Ziele andere Einstellungen benötigt, können Sie diese dort jederzeit überschreiben:

Freigegebene Projekteinstellungen, die alle Ziele erben, sofern sie diese nicht überschreiben

Freigegebene Projekteinstellungen, die alle Ziele erben, sofern sie diese nicht überschreiben

Konkrete Zieleinstellungen: PSE iPhone überschreibt die Basis-SDK-Einstellung des Projekts

Konkrete Zielsystemeinstellungen: PSE iPhone überschreibt die Base SDKProjekteinstellung

In Xcode öffnen Sie immer Projekte (oder Arbeitsbereiche, aber keine Ziele), und alle darin enthaltenen Ziele können erstellt / ausgeführt werden, es gibt jedoch keine Möglichkeit / Definition zum Erstellen eines Projekts, sodass jedes Projekt mindestens ein Ziel benötigt mehr als nur eine Sammlung von Dateien und Einstellungen sein.

Wählen Sie eines der auszuführenden Projektziele aus

Wählen Sie eines der auszuführenden Projektziele aus

In vielen Fällen sind Projekte alles, was Sie brauchen. Wenn Sie eine Abhängigkeit haben, die Sie aus dem Quellcode erstellen, können Sie sie als Teilprojekt einbetten . Teilprojekte können separat oder innerhalb ihres Superprojekts geöffnet werden.

demoLib ist ein Unterprojekt

demoLib ist ein Teilprojekt

Wenn Sie eines der Ziele des Unterprojekts zu den Abhängigkeiten des Superprojekts hinzufügen, wird das Unterprojekt automatisch erstellt, sofern es nicht unverändert geblieben ist. Der Vorteil hierbei ist, dass Sie Dateien sowohl aus Ihrem Projekt als auch aus Ihren Abhängigkeiten im selben Xcode-Fenster bearbeiten und beim Erstellen / Ausführen aus den Zielen des Projekts und seiner Teilprojekte auswählen können:

Ausführen von Zielen aus einem Teilprojekt

Wenn Ihre Bibliothek (das Teilprojekt) jedoch von einer Vielzahl anderer Projekte (oder deren Ziele, um genau zu sein) verwendet wird, ist es sinnvoll, sie auf dieselbe Hierarchieebene zu setzen - dafür sind Arbeitsbereiche gedacht . Arbeitsbereiche enthalten und verwalten Projekte, und alle direkt darin enthaltenen Projekte (dh nicht ihre Teilprojekte) befinden sich auf derselben Ebene, und ihre Ziele können voneinander abhängen (Projektziele können von den Zielen der Teilprojekte abhängen, aber nicht umgekehrt).

Arbeitsbereichsstruktur

Arbeitsbereichsstruktur

In diesem Beispiel können beide Apps ( AnotherApplication / ProjectStructureExample ) auf die Ziele des demoLib- Projekts verweisen . Dies wäre auch möglich, indem das demoLib- Projekt in beide anderen Projekte als Teilprojekt aufgenommen wird (dies ist nur eine Referenz, daher ist keine Duplizierung erforderlich). Wenn Sie jedoch viele Abhängigkeiten haben, sind Arbeitsbereiche sinnvoller. Wenn Sie einen Arbeitsbereich öffnen, können Sie beim Erstellen / Ausführen aus allen Projektzielen auswählen.

Ausführen von Zielen aus einem Arbeitsbereich

Sie können Ihre Projektdateien weiterhin separat öffnen, aber es ist wahrscheinlich, dass ihre Ziele nicht erstellt werden, da Xcode die Abhängigkeiten nur auflösen kann, wenn Sie die Arbeitsbereichsdatei öffnen. Arbeitsbereiche bieten den gleichen Vorteil wie Teilprojekte: Sobald sich eine Abhängigkeit ändert, erstellt Xcode sie neu, um sicherzustellen, dass sie auf dem neuesten Stand ist (obwohl ich einige Probleme damit hatte, scheint sie nicht zuverlässig zu funktionieren).

Ihre Fragen auf den Punkt gebracht :

1) Projekte enthalten Dateien (Code / Ressourcen), Einstellungen und Ziele, die Produkte aus diesen Dateien und Einstellungen erstellen. Arbeitsbereiche enthalten Projekte, die aufeinander verweisen können.

2) Beide sind für die Strukturierung Ihres Gesamtprojekts verantwortlich, jedoch auf verschiedenen Ebenen.

3) Ich denke, Projekte sind in den meisten Fällen ausreichend. Verwenden Sie keine Arbeitsbereiche, es sei denn, es gibt einen bestimmten Grund. Außerdem können Sie Ihr Projekt später jederzeit in einen Arbeitsbereich einbetten.

4) Ich denke, dafür ist der obige Text gedacht ...

Es gibt eine Bemerkung zu 3): CocoaPods , die automatisch Bibliotheken von Drittanbietern für Sie verwalten, verwenden Arbeitsbereiche. Daher müssen Sie sie auch verwenden, wenn Sie sie verwenden CocoaPods(was viele Leute tun).


7
Kann ein Projekt Teil von zwei separaten Arbeitsbereichen sein? Oder wenn ich ein Projekt mit zwei anderen teilen möchte, müssen sie alle Teil desselben Arbeitsbereichs sein?
Jack

8
Absolut, ein Projekt kann Teil von so vielen Arbeitsbereichen sein, wie Sie möchten. Das Hinzufügen eines Projekts zu einem Arbeitsbereich ändert nichts am Projekt selbst. Sie haben also viele Optionen ... alle in einem Arbeitsbereich, zwei Arbeitsbereichen, die ein Projekt gemeinsam nutzen, oder zwei Projekten, bei denen das gemeinsam genutzte Projekt ein Teilprojekt ist.
Hagi

1
Ich habe keine Erfahrung damit, aber die README-Datei sagt: " Sie behalten die volle Kontrolle über Ihre Projektstruktur und -einrichtung " und " anstatt [Abhängigkeiten] in einen einzelnen Arbeitsbereich zu integrieren, müssen [...] Ihre Abhängigkeiten enthalten ihr eigenes Xcode-Projekt ". Kurz gesagt: Es berührt Ihre Projekte / Arbeitsbereiche überhaupt nicht, daher sehe ich nicht, wie ich es in die Antwort aufnehmen soll. Die Antwort ist immer noch hilfreich, wenn Sie Karthago verwenden, insbesondere, da Sie entscheiden müssen, wie Sie Ihre Abhängigkeiten strukturieren möchten, aber nichts davon ist spezifisch für Karthago.
Hagi

Gut erklärt über die Projekthierarchie. Wenn ich ein Teilprojekt vom Speicherort entferne / verschiebe, bleibt das Teilprojekt im Hauptprojekt? stackoverflow.com/questions/40214505/…
Ganesh Guturi

Die übergeordnete Projektdatei enthält einen Verweis auf das Teilprojekt und keine Kopie. Wenn das Teilprojekt entfernt wird, findet das übergeordnete Projekt es nicht mehr. In der Regel möchten Sie auf Dateisystemebene sicherstellen, dass das übergeordnete Projekt über lokale Kopien aller seiner Unterprojekte verfügt. Abhängigkeitsmanager wie CocoaPods oder Carthage erledigen das für Sie, oder Sie können Git-Submodule verwenden.
Hagi

103

Ein Arbeitsbereich ist eine Sammlung von Projekten. Es ist nützlich, Ihre Projekte zu organisieren, wenn eine Korrelation zwischen ihnen besteht (z. B.: Projekt A enthält eine Bibliothek, die als Projekt selbst als Projekt B bereitgestellt wird. Wenn Sie den Arbeitsbereich erstellen, wird Projekt B in Projekt A kompiliert und verknüpft).
In den beliebten CocoaPods wird häufig ein Arbeitsbereich verwendet . Wenn Sie Ihre Pods installieren, werden sie in einem Arbeitsbereich platziert, der Ihr Projekt und die Pod-Bibliotheken enthält.


35

In Kürze

  • Xcode 3 führte ein Teilprojekt ein, bei dem es sich um eine Eltern-Kind-Beziehung handelt. Dies bedeutet, dass Eltern auf ihr untergeordnetes Ziel verweisen können, aber nicht umgekehrt
  • Mit Xcode 4 wurde der Arbeitsbereich eingeführt, bei dem es sich um eine Geschwisterbeziehung handelt. Dies bedeutet, dass jedes Projekt auf Projekte im selben Arbeitsbereich verweisen kann

2

Wenn ich CocoaPods zum Entwickeln von iOS-Projekten verwendet habe, gibt es eine .xcworkspaceDatei. Sie müssen das Projekt mit einer Datei öffnen, die sich auf .xcworkspaceCocoaPods bezieht.

Dateivorschau

Aber wenn Sie Show Package Contentsmit .xcworkspaceDatei, finden Sie die contents.xcworkspacedataDatei.

Packungsinhalt

<?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>

Achten Sie auf diese Zeile:

location = "group:BluetoothColorLamp24G.xcodeproj"

Die .xcworkspaceDatei verweist auf die .xcodeprojDatei.

Entwicklungsumgebung:

macOS 10.14
Xcode 10.1

2
  1. Was ist der Unterschied zwischen den beiden?
    Der Arbeitsbereich besteht aus einer Reihe von Projekten

  2. Wofür sind sie verantwortlich?
    Das Projekt ist für den Quellcode verantwortlich. Der Arbeitsbereich ist für Abhängigkeiten zwischen Projekten verantwortlich

  3. Mit welchem ​​von ihnen sollte ich arbeiten, wenn ich meine Apps im Team / alleine entwickle?
    Ihre Wahl sollte von einem Typ Ihres Projekts abhängen. Wenn Ihr Projekt beispielsweise auf dem CocoaPods-Abhängigkeitsmanager basiert, wird ein Arbeitsbereich erstellt.

  4. Gibt es noch etwas, das ich in Bezug auf diese beiden Dateien beachten sollte?
    Ein Konkurrent des Arbeitsbereichs ist cross-project references[About]

[Xcode-Komponenten]

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.