Какой лучший способ поменять содержимое Xcode для проектов, предназначенных для многих клиентов?
У меня есть относительно большой проект XCode, который производит одно приложение. Однако у меня есть много клиентов / клиентов, которым требуется глубокая настройка и брендинг указанного приложения. Эти конфигурации включают в себя различную графику, несколько разных интерфейсов и реализаций и, возможно, самое главное, файлы.xcconfig.
В моем проекте XCode есть выделенная группа, которая указывает на папку настроек конкретного клиента на диске, поэтому, открыв проект и сборку XCode, вы получите сборку одного приложения с настройками текущего клиента. Чтобы переключиться на другого клиента, я изменяю, куда указывает эта группа на диске. (Я также изменяю и переключаю параметры xcconfig "На основе" в информационной панели проекта, чтобы перезагрузить полное наследование xcconfig; просто изменение группы, содержащей один или несколько файлов xcconfig, не перезагружает это!) Это прекрасно работает для 100+ клиенты. Немного утомительно переключать эту папку каждый раз, когда вам нужно собрать приложение для другого клиента и убедиться, что xcconfig правильный, но он работает.
Сейчас я нахожусь в процессе автоматизации сборок через командную строку и сталкиваюсь с неприятностями. Быстрое и грязное решение для указания вышеупомянутой группы XCode в другую папку настроек состояло в том, чтобы скопировать ProjectName.xcodeproj/project.pbxproj
подать в ProjectName.xcodeproj/project-template.pbxproj
и поместите в этот файл заполнители, которые можно найти и заменить на имя и путь к нужной папке настроек. Затем временно перезапишите project.pbxproj с измененным project-template.pbxproj и выполните сборку, чтобы получить правильное приложение.
Как вы, вероятно, заметили, файл project.pbxproj был продублирован и изменен, и поэтому он не синхронизируется, поскольку разработчики изменяют оригинал и забывают также обновить шаблон. И, кроме того, в любом случае мне не следует так портить файлы pbxproj - это личное дело Xcode.
Итак, есть ли лучший способ сообщить XCode о папке, полной ресурсов, кода и файлов конфигурации, возможно, на этапе сборки с помощью сценария или переменной среды, а не на уровне группы проекта? Самым сложным, по-видимому, является цепочка xcconfig, поскольку каждый клиент имеет свой собственный файл xcconfig, который наследуется от файлов xcconfig отладки, разработки и распространения одного приложения.
Извините за скучность этого вопроса, но он немного сложен! Любые предложения будут ценны!
1 ответ
Я думаю, что вы бы лучше использовать функцию целей в XCode. Есть один проект и ресурсы каждого клиента в этом проекте.
Затем вы можете скопировать уже имеющуюся цель (щелкните правой кнопкой мыши по цели, выбрав файл проекта в Навигаторе проектов XCode).
Все ваши цели будут скомпилированы с одинаковым кодом. Вам просто нужно изменить ресурсы в "Фазы сборки"> "Копировать ресурсы комплекта", чтобы создать разные приложения для каждой цели. Не нужно смотреть на внутренние файлы Xcode.
Вы даже можете изменить код в ваших исходных файлах, добавив макрос препроцессора в параметры сборки (что-то вроде FIRST_CLIENT=1
), а затем найдите эти определения в вашем файле с #if FIRST_CLIENT
,
У меня есть проект, подобный этому, и он работает довольно хорошо:
http://f.cl.ly/items/3G0b0P35261x3O263h14/Screen%20Shot%202011-10-18%20at%2013.55.55.PNG