Ответ 1
Существует два способа создания пакета приложений на MacOSX, Easy и Ugly.
Легкий способ - просто использовать XCode. Готово.
Проблема иногда вы не можете.
В моем случае я создаю приложение, которое создает другие приложения. Я не могу предположить, что пользователь установил XCode. Я также использую MacPorts для создания библиотек, от которых зависит мое приложение. Мне нужно убедиться, что эти dylibs в комплекте с приложением, прежде чем я его распространю.
Отказ от ответственности: Я абсолютно безоговорочно написал этот пост, все в был близок от документов Apple, отделяя существующие приложения и методом проб и ошибок. Это работает для меня, но, скорее всего, неправильно. пожалуйста напишите мне, если у вас есть какие-либо исправления.
Первое, что вы должны знать, это то, что набор приложений - это просто каталог.
Пусть рассмотрим структуру гипотетического foo.app.
foo.app/ Contents/ Info.plist MacOS/ foo Resources/ foo.icns
Info.plist - это простой XML файл. Вы можете отредактировать его с помощью текстового редактора или редактора списка свойств, который поставляется в комплекте с XCode. (Он находится в каталоге /Developer/Applications/Utilities/ ).
Ключевыми вещами, которые вам нужно включить, являются:
CFBundleName - название приложения.
CFBundleIcon - Файл значка, предположительно находящийся в папке Содержание/Ресурсы. С помощью приложения Icon Composer создайте значок. (Он также находится в каталоге /Developer/Applications/Utilities/ ) Вы можете просто перетащить png на это окно и автоматически генерировать уровни mip для вас.
CFBundleExecutable - имя исполняемого файла, предположительно находящегося в папке Содержание /MacOS/.
Есть еще много вариантов, перечисленные выше - только минимальный минимум. Вот некоторые документы Apple по Info.plist файл и Структура пакета приложений.
Кроме того, здесь образец Info.plist.
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>CFBundleGetInfoString</key> <string>Foo</string> <key>CFBundleExecutable</key> <string>foo</string> <key>CFBundleIdentifier</key> <string>com.your-company-name.www</string> <key>CFBundleName</key> <string>foo</string> <key>CFBundleIconFile</key> <string>foo.icns</string> <key>CFBundleShortVersionString</key> <string>0.01</string> <key>CFBundleInfoDictionaryVersion</key> <string>6.0</string> <key>CFBundlePackageType</key> <string>APPL</string> <key>IFMajorVersion</key> <integer>0</integer> <key>IFMinorVersion</key> <integer>1</integer> </dict> </plist>
В идеальном мире вы можете просто удалить исполняемый файл в Содержание /MacOS/dir и сделайте. Однако, если ваше приложение имеет нестандартные зависимости dylib, это не сработает. Как Windows, MacOS поставляется с собственным специальным видом DLL Hell.
Если вы используете MacPorts для создания библиотек, на которые вы ссылаетесь, места расположения dylib будут жестко закодированы в вашем исполняемом файле. Если вы запустите приложение на машине с дилибами в том же месте, она будет работать нормально. Однако большинство пользователей не будут их устанавливать; когда они дважды щелкнут по вашему приложению, он просто потерпит крах.
Прежде чем распространять исполняемый файл, вам нужно будет собрать все загруженные dylib и скопировать их в пакет приложений. Вам также потребуется отредактировать исполняемый файл, чтобы он искал дилибы в нужном месте. т.е. где вы их скопировали.
Неправильное редактирование исполняемого файла опасно? К счастью, есть инструменты командной строки.
otool -L executable_name
Эта команда перечислит все типы dylib, от которых зависит ваше приложение. Если вы видите какие-либо, которые НЕ находятся в папке System/Library или usr/lib, это те, которые вам нужно будет скопировать в пакет приложений. Скопируйте их в папку /Contents/MacOS/. Затем вам нужно будет отредактировать исполняемый файл, чтобы использовать новые dylib.
Во-первых, вам нужно убедиться, что вы используете флаг -headerpad_max_install_names. Это просто гарантирует, что если новый путь dylib длиннее предыдущего, у него будет место.
Во-вторых, используйте setup_name_tool для изменения каждого пути dylib.
install_name_tool -change existing_path_to_dylib @executable_path/blah.dylib executable_name
В качестве практического примера предположим, что ваше приложение использует libSDL, а otool указывает его местоположение как "/opt/local/lib/libSDL-1.2.0.dylib".
Сначала скопируйте его в пакет приложений.
cp /opt/local/lib/libSDL-1.2.0.dylib foo.app/Contents/MacOS/
Затем отредактируйте исполняемый файл, чтобы использовать новое местоположение (ПРИМЕЧАНИЕ: убедитесь, что вы создали его с флагом -headerpad_max_install_names)
install_name_tool -change /opt/local/lib/libSDL-1.2.0.dylib @executable_path/libSDL-1.2.0.dylib foo.app/Contents/MacOS/foo
Вот, мы почти закончили. Теперь есть небольшая проблема с текущим рабочим каталогом.
При запуске приложения текущий каталог будет каталогом выше, где находится приложение. Например: если вы поместите файл foo.app в папку /Applcations, тогда текущий каталог при запуске приложения будет папкой /Applications. Не следует использовать /Applications/foo.app/Contents/MacOS/, как вы могли бы ожидать.
Вы можете изменить свое приложение для учетной записи, или вы можете использовать эту волшебную маленькую пусковую установку script, которая изменит текущий каталог и запустит ваше приложение.
#!/bin/bash cd "${0%/*}" ./foo
Убедитесь, что вы настроили файл Info.plist, чтобы CFBundleExecutable указывал на запуск script, а не на предыдущий исполняемый файл.
Хорошо, все сделано сейчас. К счастью, как только вы все это знаете, вы хороните его в сборке script.