Может ли Xcode использовать "Ссылки на папки" для кода?
Как и многие люди, мне бы очень хотелось, чтобы Xcode использовал структуру папок, которая отражает структуру папок на диске. Однако я не могу получить код в "ссылках на папки" (голубые папки), чтобы отображаться в моих целевых проектах в разделе "Источники компиляции". Есть ли способ сделать это?
Мне удалось добавить циановую папку на фазу сборки "Компиляция источников", но это не приводит к добавлению содержимого этой папки.
Как использовать ссылки на папки для кода?
Ответы
Ответ 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, а затем вставить этот проект в любой другой проекты, которые совместно используют эту папку.