Лучший способ установить пользовательские рамки какао

У меня есть пользовательская структура, которая, следуя советам в Apple,Руководство по программированию Framework >> Установка вашего фреймворка Я устанавливаю в / Library / Frameworks. Я делаю это, добавляя этап сборки Run Script с помощью следующего скрипта:

cp -R  build/Debug/MyFramework.framework /Library/Frameworks

В моих проектах я затем связываюсь с / Library / Frameworks / MyFramework и импортирую его в мои классы следующим образом:

#import 

Это работает очень хорошо, за исключением того, что я всегда вижу следующее сообщение в моей консоли отладчика:

Загрузка программы в отладчик… sharedlibrary apply-load-rules all предупреждение: невозможно прочитать символы для "/Users/elisevanlooij/Library/Frameworks/MyFramework.framework/Versions/A/MyFramework» (файл не найден). предупреждение: невозможно прочитать символы из "MyFramework» (еще не отображается в памяти). Программа загружена.

Видимо, компилятор сначала заглядывает в / Users / elisevanlooij / Library / Frameworks, может 'Не могу найти MyFramework, затем заглядывает в / Library / Frameworks, находит MyFramework и продолжает свой веселый путь. До сих пор это было скорее раздражением, чем реальной проблемой, но при запуске модульных тестов GDB останавливается (файл не найден) и отказывается продолжать. Я решил проблему, добавив дополнительную строку в фазу запуска сценария

cp -R  build/Debug/MyFramework.framework ~/Library/Frameworks

но это похоже на самозапечатывание чего-то, что не должноне быть сломанным во-первых. Как я могу это исправить?

Ответы на вопрос(4)

Решение Вопроса

поэтому яЯ переписываю этот ответ. Обратите внимание, что яя говорю оустановка фреймворка как часть рабочего процесса разработки.

Предпочтительным местом для установки общедоступного фреймворка (то есть фреймворка, который будет использоваться более чем одним из ваших приложений или пакетов) является / Library / Frameworks [link text] потому что "фреймворки в этом месте автоматически обнаруживаются компилятором во время компиляции и динамическим компоновщиком во время выполнения. "Рамочное руководство по программированию. Самый элегантный способ сделать это - в разделе «Развертывание» в настройках сборки.

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

Дважды щелкните цель фреймворка, чтобы открыть информационное окно Target, и перейдите на вкладку Build.Выберите Release в окне выбора конфигурации.Прокрутите вниз до раздела Развертывание и введите следующие значения:

Место развертывания = ДА (установите флажок)

Установка Сборка продуктов Расположение = /

Каталог установки = / Библиотека / Каркасы

Расположение продуктов сборки установки служит корнем установки. По умолчанию используется каталог / tmp: если вы неВы не можете изменить его на системный кореньникогда не увидим вашу установленную платформу, так какы прячутся в / тмп.

Теперь вы можете работать со своей инфраструктурой так, как вам нравится в конфигурации отладки, не расстраивая другие проекты, и когда вы будете готовы опубликовать, все, что вам нужно сделать, - это переключиться на Release и выполнить Build.

Предупреждение Xcode 4 С переходом на Xcode 4 яУ меня возникли проблемы с моей пользовательской платформой. В основном они связывают предупреждения в GDB, которые на самом деле не влияют на полезность инфраструктуры, за исключением случаев запуска встроенного модульного теста. Я отправил заявку в техподдержку в Apple неделю назад, и они все еще изучают ее. Когда я получу рабочее решение, я обновлю этот ответ, так как вопрос оказался довольно популярным (1 kViews и подсчет).

 Elise van Looij13 нояб. 2009 г., 10:06
Я проголосовал за его ответ, поэтому надеюсь, что мои коленные чашечки в безопасности. Но я считаю, что решение, к которому я пришел, более элегантно, так как оно включает меньше изменений в настройках Xcode по умолчанию и устраняет необходимость в командной строке.
 NSResponder07 нояб. 2009 г., 12:14
Вы должны рассматривать любые ответы от cdespinosa относительно системы сборки Xcode как достоверные.

когда вы распространяете ваш фреймворк, он должен быть установлен в / Library / Frameworks; однако мне кажется странным, что тыЭто делается с помощью тестовой / отладочной версии вашей платформы.

Моим первым инстинктом было бы установить тестовые версии в ~ / Library, поскольку это значительно упрощает настройку среды тестирования и отладки. Если возможно, я ожидаю, что инфраструктура отладки / тестирования будет расположена в дереве сборки версии I 'м тестирование, в этом случае этоустановлен какЧастная структура в целях тестирования. Это сделает вашу жизнь намного проще, когда придет время работать с несколькими версиями вашей платформы.

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

 Elise van Looij04 нояб. 2009 г., 21:38
Поскольку фреймворк используется несколькими проектами, его установка в качестве частного фреймворка невозможна. Я пробовал то же самое с версией выпуска (cp -R build / Release / MyFramework.framework / Library / Frameworks), но результат тот же. Что касается того, не имеет значения, где находится структура, пока ... - ну, слова подводят меня.

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

Затем вы можете удалить cp -r и вместо этого использовать параметр сборки Install Location, чтобы поместить ваш продукт сборки в окончательное местоположение, используя xcodebuild install DSTROOT = / в командной строке. Но ты'нужно будет сделать это только когдане каждый раз, когда вы перестраиваете фреймворк.

 Elise van Looij06 нояб. 2009 г., 21:53
Интересно, но я обнаружил две проблемы с этим подходом. Прежде всего, xcodebuild install DSTROOT = / вылечивает "Невозможно прочитать символы " проблема. Однако: 1) Когда каталог сборки для платформы указывался на общий каталог сборки (вне папки проекта), xcodebuild каким-то образом пропустил бы изменения, внесенные в среду. Дата изменения заголовочных файлов фреймворка будет меняться, но не содержимое (возможно, связано с управлением версиями?). 2) Когда я изменил каталог сборки обратно на сборку по умолчанию, xcodebuild установит внутри фреймворка еще одну копию фреймворка. Weird.

нет особых оснований для того, чтобы поместить фреймворк в Library / Frameworks, и этомного работы: тыМне нужно либо сделать это для пользователя в пакете установщика, что создает огромные трудности при создании и обслуживании, либо иметь код установки в вашем приложении (которое можно установить только в ~ / L / F, если вы не тратите время и силы). необходимо сделать ваше приложение способным к установке в / L / F с полномочиями root).

Гораздо более распространенным являетсячто Apple называет «частный каркас », Вы'Я включу это в ваш пакет приложений.

Даже фреймворки, предназначенные для общего использования любыми приложениями (например, Sparkle, Growl), на практике созданы для использования в качестве частных фреймворков просто потому, что «право" способ установки единственной копии фреймворка в Library / Frameworks - это такой хлопот.

 Peter Hosey21 дек. 2011 г., 23:06
@RaffiKhatchadourian: Быть стандартным местоположением не значит, что нужно сделать какой-то инсталлятор для установки там фреймворков для пользователей. машины. Это "действительно просто скопировать пакет .framework » там натвой собственный компьютер, но вам нужно сделать для него установщик, если вы хотите, чтобы кто-то еще мог использовать ваше приложение без сбоев при запуске. Встраивание фреймворка в приложение проще для всех участников.
 Peter Hosey18 дек. 2011 г., 23:26
@RaffiKhatchadourian: Но тогда ваша заявка выигралаработать на кого-то еще. Вы должны установить каркас (ы) в L / F для каждого пользователяс машиной; приложение победилоЗапустить для любого пользователя, который нене может иметь рамки в том же месте, где вы их имели.
 Elise van Looij08 янв. 2010 г., 17:15
Я неНе сомневаюсь, что создание установочного пакета - большая работа - ямы никогда этого не делали и этоэто не то, что я с нетерпением жду. Но так как это должно быть сделано в любом случае для приложений, я могуЯ не вижу, что добавление еще одного для фреймворка было бы таким большим делом - в любом случае, вероятно, его следует включить в установщики приложений, если только это не окажется необычайно популярным фреймворком. В общем, яЯ не убежден, что сохранение частной структуры очень важно.
 Raffi Khatchadourian02 янв. 2012 г., 20:16
@PeterHosey Иногда это 'Невозможно или идеально встраивать фреймворк в приложение. Например, у вас может быть несколько приложений, использующих фреймворк. Кроме того, создать установочный пакет очень просто с помощью инструмента создания пакетов.
 Raffi Khatchadourian31 мар. 2012 г., 02:00
@PeterHosey Я не согласен с твоим первым утверждением. В любом случае, PackageMaker недавно получил обновление с Xcode 4.3. Это должно быть проще в использовании сейчас. Кроме того, удаление на Mac всегда было отсутствующей функцией.
 Raffi Khatchadourian17 дек. 2011 г., 01:37
Я не согласен. Это'действительно просто скопировать пакет .framework в / Library / Frameworks и затем импортировать его в другие проекты Xcode.
 Raffi Khatchadourian21 дек. 2011 г., 19:49
@PeterHosey / Library / Frameworks - это стандартное место для фреймворков, поэтомуэто не проблема.
 Peter Hosey02 янв. 2012 г., 20:22
@RaffiKhatchadourian: несколько приложений, использующих фреймворк, несделать / L / F предпочтительным (установка и удаление все еще перевешивают его), а PackageMaker выглядит проще, чем есть на самом деле, и не делаетпомочь пользователям удалить структуру, если они решат, что нене хочу этого

Ваш ответ на вопрос