Я думаю, что есть три ключевых момента, которые вам необходимо понять относительно структуры проекта: цели , проекты и рабочие пространства . Цели подробно определяют, как создается продукт / двоичный файл (т. Е. Приложение или библиотека). Они включают в себя параметры сборки, такие как флаги компилятора и компоновщика, и определяют, какие файлы (исходный код и ресурсы) действительно принадлежат продукту. Когда вы строите / запускаете, вы всегда выбираете одну конкретную цель.
Вероятно, у вас есть несколько целей, которые совместно используют код и ресурсы. Этими различными целями могут быть несколько разные версии приложения (iPad / iPhone, разные маркировки и т. Д.) Или контрольные примеры, которым, естественно, требуется доступ к тем же исходным файлам, что и у приложения. Все эти связанные цели могут быть сгруппированы в проекте . В то время как проект содержит файлы из всех своих целей, каждая цель выбирает свое собственное подмножество соответствующих файлов. То же самое относится и к настройкам сборки: вы можете определить в проекте настройки по умолчанию для всего проекта, но если одна из ваших целей нуждается в других настройках, вы всегда можете переопределить их там:
Настройки общего проекта, которые наследуют все цели, если они не переопределяют его
Конкретные параметры мишени: PSE iPhone имеет приоритет проекта Base SDK
настройки
В XCode вы всегда открываете проекты (или рабочие области, но не цели), и все цели, которые он содержит, могут быть построены / выполнены, но нет никакого способа / определения построения проекта, поэтому для каждого проекта требуется по крайней мере одна цель, чтобы быть больше, чем просто набор файлов и настроек.
Выберите одну из целей проекта для запуска
Во многих случаях проекты - это все, что вам нужно. Если у вас есть зависимость, которую вы строите из исходного кода, вы можете встроить ее как подпроект . Подпроекты могут быть открыты отдельно или в рамках их суперпроекта.
demoLib - это подпроект
Если вы добавите одну из целей подпроекта к зависимостям суперпроекта, подпроект будет автоматически создан, если он не останется неизменным. Преимущество здесь в том, что вы можете редактировать файлы как из вашего проекта, так и из ваших зависимостей в одном и том же окне XCode, а когда вы строите / запускаете, вы можете выбирать из целей проекта и его подпроектов:
Однако, если ваша библиотека (подпроект) используется множеством других проектов (или, если быть точным, их целями), имеет смысл поместить ее на тот же уровень иерархии - для этого и нужны рабочие пространства . Рабочие пространства содержат и управляют проектами, и все включенные в него проекты (т.е. не их подпроекты) находятся на одном уровне, и их цели могут зависеть друг от друга (цели проектов могут зависеть от целей подпроектов, но не наоборот).
Структура рабочего пространства
В этом примере оба приложения ( AnotherApplication / ProjectStructureExample ) могут ссылаться на цели проекта demoLib . Это также возможно, если включить проект demoLib в оба других проекта в качестве подпроекта (который является только справочным, поэтому дублирование не требуется), но если у вас много взаимозависимостей, рабочие пространства имеют больше смысла. Если вы открываете рабочее пространство, вы можете выбирать цели всех проектов при сборке / запуске.
Вы по-прежнему можете открывать файлы проекта отдельно, но, скорее всего, их цели не будут созданы, поскольку XCode не может разрешить зависимости, пока вы не откроете файл рабочей области. Рабочие пространства дают вам то же преимущество, что и подпроекты: после изменения зависимости Xcode перестроит ее, чтобы убедиться, что она обновлена (хотя у меня были некоторые проблемы с этим, похоже, она не работает надежно).
Ваши вопросы в двух словах :
1) Проекты содержат файлы (код / ресурсы), настройки и цели, которые создают продукты из этих файлов и настроек. Рабочие пространства содержат проекты, которые могут ссылаться друг на друга.
2) Оба отвечают за структурирование вашего общего проекта, но на разных уровнях.
3) Я считаю, что в большинстве случаев проектов достаточно. Не используйте рабочие пространства, если нет особой причины. Кроме того, вы всегда можете встроить свой проект в рабочее пространство позже.
4) Я думаю, что для этого приведенный выше текст ...
Есть одно замечание для 3): CocoaPods , который автоматически обрабатывает сторонние библиотеки для вас, использует рабочие пространства. Таким образом, вы должны использовать их, когда вы используете CocoaPods
(что делают многие люди).