Xcode Project и Xcode Workspace - различия

404

Я пытаюсь понять, как работает вся экосистема iOS.
До сих пор я мог найти ответ на большинство моих вопросов (и, поверьте мне, их было много), но на этот вопрос пока нет четкого ответа.

В чем разница между файлами XcodeProject и XcodeWorkspace?

  1. В чем разница между ними двумя?
  2. За что они отвечают?
  3. С каким из них мне следует работать, когда я разрабатываю свои приложения в команде / в одиночку?
  4. Есть ли что-то еще, что я должен знать в отношении этих двух файлов?
ms2
источник

Ответы:

608

Я думаю, что есть три ключевых момента, которые вам необходимо понять относительно структуры проекта: цели , проекты и рабочие пространства . Цели подробно определяют, как создается продукт / двоичный файл (т. Е. Приложение или библиотека). Они включают в себя параметры сборки, такие как флаги компилятора и компоновщика, и определяют, какие файлы (исходный код и ресурсы) действительно принадлежат продукту. Когда вы строите / запускаете, вы всегда выбираете одну конкретную цель.

Вероятно, у вас есть несколько целей, которые совместно используют код и ресурсы. Этими различными целями могут быть несколько разные версии приложения (iPad / iPhone, разные маркировки и т. Д.) Или контрольные примеры, которым, естественно, требуется доступ к тем же исходным файлам, что и у приложения. Все эти связанные цели могут быть сгруппированы в проекте . В то время как проект содержит файлы из всех своих целей, каждая цель выбирает свое собственное подмножество соответствующих файлов. То же самое относится и к настройкам сборки: вы можете определить в проекте настройки по умолчанию для всего проекта, но если одна из ваших целей нуждается в других настройках, вы всегда можете переопределить их там:

Настройки общего проекта, которые наследуют все цели, если они не перезаписывают его

Настройки общего проекта, которые наследуют все цели, если они не переопределяют его

Конкретные настройки цели: PSE iPhone перезаписывает настройки Base SDK проекта

Конкретные параметры мишени: PSE iPhone имеет приоритет проекта Base SDKнастройки

В XCode вы всегда открываете проекты (или рабочие области, но не цели), и все цели, которые он содержит, могут быть построены / выполнены, но нет никакого способа / определения построения проекта, поэтому для каждого проекта требуется по крайней мере одна цель, чтобы быть больше, чем просто набор файлов и настроек.

Выберите одну из целей проекта для запуска

Выберите одну из целей проекта для запуска

Во многих случаях проекты - это все, что вам нужно. Если у вас есть зависимость, которую вы строите из исходного кода, вы можете встроить ее как подпроект . Подпроекты могут быть открыты отдельно или в рамках их суперпроекта.

demoLib - это подпроект

demoLib - это подпроект

Если вы добавите одну из целей подпроекта к зависимостям суперпроекта, подпроект будет автоматически создан, если он не останется неизменным. Преимущество здесь в том, что вы можете редактировать файлы как из вашего проекта, так и из ваших зависимостей в одном и том же окне XCode, а когда вы строите / запускаете, вы можете выбирать из целей проекта и его подпроектов:

Запуск целей из подпроекта

Однако, если ваша библиотека (подпроект) используется множеством других проектов (или, если быть точным, их целями), имеет смысл поместить ее на тот же уровень иерархии - для этого и нужны рабочие пространства . Рабочие пространства содержат и управляют проектами, и все включенные в него проекты (т.е. не их подпроекты) находятся на одном уровне, и их цели могут зависеть друг от друга (цели проектов могут зависеть от целей подпроектов, но не наоборот).

Структура рабочего пространства

Структура рабочего пространства

В этом примере оба приложения ( AnotherApplication / ProjectStructureExample ) могут ссылаться на цели проекта demoLib . Это также возможно, если включить проект demoLib в оба других проекта в качестве подпроекта (который является только справочным, поэтому дублирование не требуется), но если у вас много взаимозависимостей, рабочие пространства имеют больше смысла. Если вы открываете рабочее пространство, вы можете выбирать цели всех проектов при сборке / запуске.

Запуск целей из рабочей области

Вы по-прежнему можете открывать файлы проекта отдельно, но, скорее всего, их цели не будут созданы, поскольку XCode не может разрешить зависимости, пока вы не откроете файл рабочей области. Рабочие пространства дают вам то же преимущество, что и подпроекты: после изменения зависимости Xcode перестроит ее, чтобы убедиться, что она обновлена ​​(хотя у меня были некоторые проблемы с этим, похоже, она не работает надежно).

Ваши вопросы в двух словах :

1) Проекты содержат файлы (код / ​​ресурсы), настройки и цели, которые создают продукты из этих файлов и настроек. Рабочие пространства содержат проекты, которые могут ссылаться друг на друга.

2) Оба отвечают за структурирование вашего общего проекта, но на разных уровнях.

3) Я считаю, что в большинстве случаев проектов достаточно. Не используйте рабочие пространства, если нет особой причины. Кроме того, вы всегда можете встроить свой проект в рабочее пространство позже.

4) Я думаю, что для этого приведенный выше текст ...

Есть одно замечание для 3): CocoaPods , который автоматически обрабатывает сторонние библиотеки для вас, использует рабочие пространства. Таким образом, вы должны использовать их, когда вы используете CocoaPods(что делают многие люди).

хаги
источник
7
Может ли один проект быть частью двух отдельных рабочих областей? Или, если я хочу поделиться одним проектом с двумя другими, нужно ли им быть частью одного рабочего пространства?
Джек,
8
Безусловно, проект может входить в любое количество рабочих областей. Добавление проекта в рабочую область ничего не меняет в самом проекте. Таким образом, у вас есть много вариантов ... все в одном рабочем пространстве, два рабочих пространства, которые совместно используют один проект, или два проекта, которые имеют общий проект в качестве подпроекта.
аги
1
У меня нет никакого опыта с этим, но README говорит: « вы сохраняете полный контроль над структурой и настройкой вашего проекта », и « вместо интеграции [зависимостей] в одно рабочее пространство, [...] ваши зависимости должны включать их собственный проект XCode ". Короче говоря: он вообще не касается ваших проектов / рабочих пространств, поэтому я не понимаю, как мне включить его в ответ. Ответ по-прежнему полезен, если вы используете Карфаген, особенно если вам нужно решить, как структурировать ваши зависимости, но ничего из этого не относится к Карфагену.
аги
Хорошо объяснил про иерархию проекта. Если я удалю / переместлю подпроект из местоположения, то подпроект останется в основном проекте? stackoverflow.com/questions/40214505/…
Ганеш Гутури
В родительском файле проекта есть ссылка на подпроект, а не копия. Если подпроект удален, родитель больше не найдет его. Как правило, на уровне файловой системы вы хотите убедиться, что у родительского проекта есть локальные копии всех его подпроектов. Менеджеры зависимостей, такие как CocoaPods или Carthage, сделают это за вас, или вы можете использовать подмодули git.
Хаги
103

Рабочая область - это коллекция проектов. Полезно организовывать свои проекты, когда между ними есть корреляция (например, проект A включает в себя библиотеку, которая предоставляется как сам проект в качестве проекта B. При создании рабочей области проект B компилируется и связывается в проекте A).
Обычно используется рабочее пространство в популярных CocoaPods . Когда вы устанавливаете ваши модули, они помещаются в рабочее пространство, в котором хранятся ваш проект и библиотеки модулей.

andreamazz
источник
35

Вкратце

  • Xcode 3 ввел подпроект, который является родителем-дочерним отношением, означая, что родитель может ссылаться на свою дочернюю цель, но не наоборот
  • Xcode 4 представил рабочую область, которая является родственной связью, означая, что любой проект может ссылаться на проекты в одной рабочей области
onmyway133
источник
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
ifeegoo
источник
2
  1. В чем разница между ними двумя?
    Рабочая область - это набор проектов

  2. За что они отвечают?
    Проект отвечает за исходный код. Рабочая область отвечает за зависимости между проектами

  3. С каким из них мне следует работать, когда я разрабатываю свои приложения в команде / в одиночку?
    Ваш выбор должен зависеть от типа вашего проекта. Например, если ваш проект использует менеджер зависимостей CocoaPods, он создает рабочее пространство.

  4. Есть ли что-то еще, что я должен знать в отношении этих двух файлов?
    Конкурент рабочей области cross-project references[О]

[Компоненты XCode]

yoAlex5
источник