Портирование установщика сборки командной строки PackageMaker в pkgbuild
Я пытаюсь выполнить перенос командной строки Mac PackageMaker в pkgbuild и productbuild, но я застрял. К сожалению, я не нашел ничего, что документировало, как работают эти новые программы, за исключением этого qaru.site/info/39196/... и pkgbuild и productbuild man-страницы.
Вот моя проблема. Я создал корневой каталог установки, в котором есть следующие файлы:
/some_path/Applications
/MyProgram.app
/Library
/Frameworks
/MyFramework.framework
/[library files...]
Вызов командной строки ниже работал отлично для PackageMaker. Он создал установщик, который установил все файлы выше.
$ /Developer/usr/bin/packagemaker \
--title "My Program" \
--root /some_path \
--version 1.0.0 \
--filter "\.DS_Store" \
--resources ./resources/ \
--scripts ./scripts/ \
--root-volume-only \
--domain system \
--verbose \
--no-relocate \
--target 10.5 \
--id com.my_company.pkg \
--out MyProgram.pkg
Теперь я пытаюсь написать это с помощью pkgbuild и иметь серьезную проблему. Я использую следующий вызов:
$ pkgbuild \
--root /some_path \
--version 1.0.0 \
--install-location "/" \
--scripts "./scripts/" \
--identifier "com.my_company.pkg" \
MyProgram.pkg
Эта команда создает установщик, который копирует каталог MyProgram.framework в /Library/Frameworks. Однако он не устанавливает файл MyProgram.app в каталог /Applications. Когда я смотрю журналы установки, я вижу это сообщение:
Приложения/MyProgram.app перемещены в /some _path/Applications/MyProgram.app
Может кто-нибудь пролить свет на то, почему это не добавляет файл MyProgram.app в каталог /Applications, как это делал PackageMaker?
Ответы
Ответ 1
К сожалению, ответ на этот вопрос был не совсем тем, что я искал. Я не мог понять, как исключить PackageMaker из процесса. Однако есть решение, которое включает pkgutil вместе с PackageMaker для создания установщика с настраиваемым приветственным сообщением, лицензией и фоновым изображением полностью в командной строке. GUI PackageMaker не требуется. Шаги следующие:
- Запустите исполняемый файл командной строки packagemaker в специальной структуре каталогов. Эта структура каталогов отражает файловую систему Mac. Читайте больше в старом, но надежном руководстве "PackageMaker How-to".
- Запустите pkgutil (
pkgutil --expand
), чтобы извлечь содержимое пакета - Посмотрите на содержимое и определите, что вы хотите изменить. Некоторые параметры - приветственное сообщение, лицензия и фоновое изображение.
- Добавьте команды для изменения этих файлов через командную строку. Обратитесь к руководству "Автоматизация Apple PackageMaker" для получения дополнительной информации. Самый простой способ - просто запустить что-то вроде этого
echo '<background file="your_background.png">'
. - Запустите pkgutil (
pkgutil --flatten
), чтобы пересобрать пакет.
Ответ 2
Во-первых, вы уверены, что вам нужен установщик? Вы можете разместить фреймворк внутри приложения. Установщик и pkgbuild немного слабее, если не сказать больше.
Теперь к проблеме: Перемещение связано с тем, что пользователь может перенести приложение из/Приложения, чтобы сказать /WorkApplications/PrivateApplications. В вашем случае установщик, вероятно, находит ваше приложение в папке сборки и устанавливает его поверх этого.
Я думаю, что установщик использует идентификатор Bundle приложения и Spotlight для перемещения, поэтому для тестирования вы можете добавить папку сборки в список игнорирования Spotlight.
Вы можете определить в список свойств компонента BundleIsRelocatable
. Если вам действительно нужно установить глобальную структуру, это один пакет, где вы хотите установить BundleIsRelocatable в false.
Ответ 3
Вопрос, на который вы ссылаетесь, имеет почти все, что вам нужно для полного устранения Package Maker. Одна вещь, которую я добавил, заключается в использовании sed
после вызова productbuild --synthesize ...
для вставки строк в файл распространения. Например, вот некоторые команды терминала, которые я использую, когда я уже создал компонентный пакет:
productbuild --synthesize --package "components/SubPackage.pkg" "distribution.xml"
sed -i "" \
-e '$ i\
\ <title>Installer Title</title>' \
-e '$ i\
\ <background file="background.png" alignment="left" scaling="proportional" />' \
-e '$ i\
\ <welcome file="welcome.rtf" />' \
"distribution.xml"
productbuild --distribution "distribution.xml" --resources "resources/" --package-path "components/" "Installer.pkg"
Это позволяет избежать необходимости использовать pkgutil --expand
и pkgutil --flatten
для изменения установщика.
Ответ 4
Создайте файл plist компонента, который имеет значение для перемещаемого свойства. pkgbuild --analyze --root "$ dst_src_root" "$ installer_root/Components.plist"
Отредактируйте plist компонента и установите "BundleIsRelocatable" в false.
Это делается один раз в моем проекте, так как содержимое установщика не меняется (одно приложение и один плагин). Я каждый раз использую один и тот же plist компонента для создания пакета содержимого.
sudo pkgbuild --root "$ dst_src_root" --component-plist "$ installer_root/Components.plist" --identifier "com.company.app" --version "1.0" --scripts "$ dst_scpt_root" "$ dst_pkg_root/InstallPackage/cisContents.pkg"
Затем, используя productbuild, мы можем создать окончательный пакет