Подтвердить что ты не робот

Может ли Xcode использовать "Ссылки на папки" для кода?

Как и многие люди, мне бы очень хотелось, чтобы Xcode использовал структуру папок, которая отражает структуру папок на диске. Однако я не могу получить код в "ссылках на папки" (голубые папки), чтобы отображаться в моих целевых проектах в разделе "Источники компиляции". Есть ли способ сделать это?

Мне удалось добавить циановую папку на фазу сборки "Компиляция источников", но это не приводит к добавлению содержимого этой папки.

Как использовать ссылки на папки для кода?

4b9b3361

Ответ 1

Простой (и очень неудачный) ответ заключается в том, что ссылки на папки в Xcode остаются сломанными и багги, они не работают. Протестировано 04 марта 2017 года в Xcode 8.2.1

Ниже приведен пример исследования, поэтому вам не нужно тратить время на повторение ошибки Xcode.

(кстати, ошибка Xcode разбилась дважды, когда я приводил этот пример)

В общем случае желание использовать ссылку на папку в Xcode, чтобы Xcode собирал все файлы в папке и включал их в проект, а прокси-сервер автоматически обновлялся на основе любых изменений Finder или Xcode папка. Таким образом, 50 проектов, использующих один и тот же набор общих файлов исходного кода, не обязательно должны быть индивидуально обновлены, когда эти папки будут изменены. Ниже рассматривается, как это нарушается в Xcode (проверено в 8.2.1).

Пример: ViewController.m включает NSError+Core.h, поэтому мы хотим, чтобы все из папки "NSError + Core" добавлялось в проект.

введите описание изображения здесь

NSError+Core.h находится в этой центральной папке разработки

введите описание изображения здесь

Перетащите исходную папку из Finder в проект под группой "Поддержка" (ничего не меняя рукава, простое перетаскивание)

введите описание изображения здесь

Xcode по-настоящему предлагает добавить перетаскивание к цели, обратите внимание, что выбрано "Создать ссылки на папки", а не "Создать ссылки групп". Также обратите внимание, что Xcode предлагает и ему предлагается добавить эту папку и файлы в целевые объекты.

введите описание изображения здесь

Хотя все выглядит так, как должно работать, компилятор не подбирает файл заголовка, а перекомпилировать дает те же результаты... не удается найти заголовок. Отключение DerivedData тоже не помогает.

введите описание изображения здесь

Таким образом, делая двойную проверку, мы проверяем "Скомпилировать источники" в проекте и, конечно же, исходного файла также нет. Помните, что Xcode "добавил" его к цели...

введите описание изображения здесь

Так что, если мы перетащим его из папки в группу "Поддержка"...

введите описание изображения здесь

Он предлагает снова добавить их в проект?! Обратите внимание, что настройки идентичны в первый раз, когда они были наркотиками в силу перетаскивания родительских папок вместо файлов...

введите описание изображения здесь

И теперь исходный файл появляется в списке "Источники компиляции". Обратите внимание на странный двойной список файлов в проекте.

(Xcode разбился вскоре после щелчка этого снимка экрана)

введите описание изображения здесь

И, конечно же, компилятор теперь может найти файл заголовка, и ошибка будет устранена при импорте, поскольку он должен иметь первый раз, когда мы употребляем его...

введите описание изображения здесь

Вам просто нужно немного помочь "найти" файл? Если это так, "Создать ссылки на папки" делает именно то, что?

Итак, мы пытаемся убрать и перетащить файлы обратно из родительской группы "Поддерживаемые файлы" в их законную папку. Без подтверждения, индикации, уведомления файлы просто исчезают из группы, и ничего не происходит в папке NSError + Core.

введите описание изображения здесь

Кстати, это действительно удалило их из проекта... В источниках компиляции больше нет ссылки NSError + Core.m.

введите здесь описание изображения

SO для подведения итогов, "Ссылки на папки", реализованные до сих пор, как представляется, не имеют какой-либо полезной цели... Похоже, что это будет 6+-летний dunsel на USS Xcode.

Ответ 2

Связанные с Kevin исходные папки, ссылки на папки и т.д., очень полезны, когда у вас есть общая база кода, совместно используемая в разных IDE, например, для моих игр, которые я компилирую в Windows, Mac, iOS, Android, Linux, и т.д. У меня есть 3 разных IDE, которые строят одну и ту же общую кодовую базу, поэтому очень полезно, когда вы автоматически загружаете новый файл и добавляете его прямо в проект после того, как я просто запустил обновление svn, и я передаю svn из одной IDE (скажем, XCode), и мой проект Eclipse в Windows получает изменения. У меня есть другой проект для каждого, потому что каждый IDE любит файлы проекта в определенной конфигурации, поэтому мне легче иметь несколько каталогов SVN (базовый проект, проект-иос, проект-андроид), которые все используют код в базовом проекте, чем иметь один мегапроектный каталог с разными битами IDE, которые, к счастью, все сунули в подкаталоги (это то, что я пробовал в первый раз).

Кроме того, он отлично работал в XCode 3. Они, похоже, не понравились этой полезной функции, поэтому она больше не работает в XCode 4, как я только что узнал.

Ответ 3

Я просто попытался сделать это, чтобы разделить код на несколько проектов Xcode, и наша команда пришла к выводу, что лучше создать проект Xcode, который содержит все ваши общие классы, компилирует их в статическую/динамическую библиотеку, а затем добавьте это как подпроект в те, кому нужен общий код. Затем вы можете настроить целевые зависимости и связать свою общую библиотеку. Это даст вам "автоматическое обновление" каждый раз, когда вы добавляете новый класс в проект общей библиотеки.

Этот подход также хорошо работает с подмодулями или даже с cocoapods/carthage.

Ответ 4

Вы не можете. Почему вы даже пытаетесь? Справочное задание папки состоит в том, чтобы создать папку, не имея записей для всех отдельных файлов в папке. Основное предназначение - копирование всей папки ресурсов в проект. Если вы хотите скомпилировать источники, то эти источники должны быть указаны в фазе сборки источников компиляции объекта, для чего требуется наличие отдельных записей для каждого файла.

В зависимости от того, что в папке, имеет смысл иметь Makefile или какой-либо другой внешний процесс сборки, который создает содержимое в папке в статическую библиотеку. Таким образом вы можете вызывать этот процесс сборки из фазы Script, а затем просто ссылаться в результирующей статической библиотеке. Альтернативно, если вы используете эту папку как способ иметь общий бит кода (например, svn: externals или подмодуль git), вы можете предоставить этой папке свой собственный проект Xcode, а затем вставить этот проект в любой другой проекты, которые совместно используют эту папку.