Вопрос или проблема
Что-то смешное произошло с началом Xcode 16. Когда я создаю проект, файлы этого проекта появляются в алфавитном порядке в навигаторе проекта и не могут быть rearranged перетаскиванием, как это было в прошлом.
Вот скриншот навигатора проекта нового проекта:
Я могу попытаться перетащить, скажем, AppDelegate.swift в другое место, чтобы сгруппировать Swift файлы вместе, но я не могу этого сделать. Что происходит?
Что здесь происходит?
Как объясняют заметки о выпуске, в мире “папок” в навигаторе проекта появился новый игрок.
Ранее было два типа сущностей, изображаемых как папка в навигаторе проектов: группы и папки. Группа — это способ объединения файлов для удобства только в самом навигаторе проекта. Папка — это, по сути, группа, которая соответствует папке на диске; другими словами, у неё есть “физическая” реальность за пределами иерархии навигатора проекта.
Итак, Xcode 16 вводит совершенно новый способ кодирования проекта и его содержимого внутри. Раньше, будь то группа или папка, каждый отдельный файл в навигаторе проекта должен был быть перечислен индивидуально в файле проекта (project.pbxproj, скрытом внутри MyCoolApp.xcodeproj или какого-либо другого названия вашего проекта). Но это вызвало частые конфликты слияния среди членов команды, использующих Git для совместной работы над проектом, в результате чего файл pbxproj приходилось редактировать вручную для разрешения конфликта — страшно, и с предсказуемым исходом, что слишком часто весь проект разрушался.
Решение Xcode 16 заключается в том, чтобы позволить вам сказать: “Эй, Xcode, вот папка с файлами. Посмотри на эту папку на диске. Каждый файл в этой папке должен быть индивидуальным файлом в проекте, и ты должен перечислить его в навигаторе проекта.” Это называется папкой для сборки.
Итак, в новом порядке, когда вы создаёте новый проект в Xcode 16, начальная “папка”, содержащая файлы вашего проекта в навигаторе проекта, является папкой для сборки. В файле pbxproj есть только одна запись: папка для сборки. Таким образом, в моем скриншоте из вышеупомянутого вопроса нет записи в pbxproj для AppDelegate.swift, SceneDelegate.swift и так далее. Они присутствуют в “папке” в навигаторе проекта, потому что Xcode просмотрел содержимое папки MyCoolApp на диске и перечислил его содержимое.
Ну, эти содержимое перечисляется в алфавитном порядке, и всё.
Теперь, если вам не нравится эта новинка, вы все еще можете сделать эту “папку” группой. Просто нажмите Control и кликните на “папку” в навигаторе проекта, а затем выберите “Преобразовать в группу”. Теперь файлы перечислены индивидуально в pbxproj, как это было раньше, и вы можете перетаскивать для изменения порядка файлов, как и раньше. Также существует обратная операция: вы можете Control-кликнуть на “папку”, представляющую группу, и выбрать “Преобразовать в папку”.
Недостатком всего этого является то, что слово “Папка” теперь используется довольно многообразно. Помимо термина “папка”, который я использую для обозначения типа списка в навигаторе проекта, такая “папка” теперь может представлять папку (имеется в виду в целях этого обсуждения, папка для сборки), группу (связанную с папкой на диске) или группу без папки (чисто для целей организации в навигаторе).
Ответ или решение
Причина, по которой вы не можете перетаскивать файлы для изменения их порядка в навигаторе проекта Xcode начала версии 16, связана с изменениями в структуре управления проектами и способами организации файлов.
Ранее в Xcode существовали два типа сущностей, которые обозначались как папки в навигаторе проекта: Группы и Папки. Группа — это способ объединения файлов для удобства, существующий исключительно в навигаторе проекта. Папка же представляет собой группу, которая соответствует папке на диске, то есть имеет “физическую” реальность за пределами иерархии навигатора проекта.
С выходом Xcode 16 была внедрена новая схема кодирования проекта и его содержимого. Ранее каждый файл в навигаторе проекта должен был быть перечислен отдельно в файле проекта (project.pbxproj), который находится внутри вашего .xcodeproj. Это часто приводило к конфликтам при совместной работе над проектом, что, в свою очередь, усложняло процесс слияния изменений в системах контроля версий, таких как Git.
Новая система позволяет вам создать “сборочную папку” (buildable folder). Это означает, что теперь вы можете указать Xcode: “вот папка, в которой хранится множество файлов”, и Xcode автоматически свяжет содержимое этой папки с записями в навигаторе проекта. При этом, в файле project.pbxproj теперь появляется только одна запись – для сборочной папки. Соответственно, все файлы, находящиеся в этой папке, будут упорядочены в навигаторе проекта в алфавитном порядке.
Если вам не нравится этот подход и вы хотите иметь возможность перетаскивать файлы, вы можете преобразовать сборочную папку в группу. Для этого просто щелкните правой кнопкой мыши на папке в навигаторе проекта и выберите опцию “Преобразовать в группу” (Convert to Group). После этого все файлы будут перечислены в файле project.pbxproj, и вы сможете изменять их порядок, как это было ранее.
Таким образом, использование термина “Папка” теперь может вызывать путаницу, поскольку оно обозначает различные концепции, включая сборочную папку, группу, которая связана с папкой на диске, и группу, используемую исключительно для организации в навигаторе.