Перенос установщика сборки из командной строки PackageMaker на pkgbuild

Я пытался портировать Mac PackageMaker создает из командной строки pkgbuild и productbuild, но я застрял. К сожалению, я не нашел ничего, что документировало бы, как эти новые программы работают, кроме этого сообщения StackOverflow и pkgbuild и справочные страницы по продукту.

Вот моя проблема. Я создал корневой установочный каталог, в котором есть следующие файлы:

/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. Когда я смотрю журналы установщика, я вижу следующее сообщение:

Applications / MyProgram.app перемещен в /some_path/Applications/MyProgram.app

Может ли кто-нибудь пролить свет на то, почему это не добавляет файл MyProgram.app в каталог / Applications, как это делал PackageMaker?


person Brent Matzelle    schedule 03.08.2012    source источник


Ответы (4)


К сожалению, ответ на этот вопрос был не совсем тем, что я искал. Я не мог понять, как исключить PackageMaker из процесса. Однако есть решение, которое включает pkgutil вместе с PackageMaker для создания установщика с настраиваемым приветственным сообщением, лицензией и фоновым изображением полностью в командной строке. Графический интерфейс PackageMaker НЕ требуется. Шаги следующие:

  1. Запустите командную строку создателя пакетов исполняемый файл в специальной структуре каталогов. Эта структура каталогов отражает файловую систему Mac. Подробнее читайте в старом, но надежном руководстве по PackageMaker.
  2. Запустите pkgutil (pkgutil --expand), чтобы извлечь содержимое пакета.
  3. Взгляните на содержимое и определите, что вы хотите изменить. Некоторые параметры - это приветственное сообщение, лицензия и фоновое изображение.
  4. Добавьте команды для изменения этих файлов через командную строку. Ознакомьтесь с руководством по автоматизации создания пакетов Apple для Дополнительная информация. Самый простой способ - просто запустить что-то вроде этого echo '<background file="your_background.png">'.
  5. Запустите pkgutil (pkgutil --flatten), чтобы пересобрать пакет.
person Brent Matzelle    schedule 03.10.2012

Во-первых, вы уверены, что вам нужен установщик? Вы можете поместить фреймворк внутрь приложения. Установщик и pkgbuild, мягко говоря, немного нестабильны.

Теперь к актуальной проблеме: перемещение связано с тем, что пользователь может переместить приложение из / Applications в / WorkApplications / PrivateApplications. В вашем случае установщик, вероятно, найдет ваше приложение в папке сборки и установит его поверх этого.

Я думаю, что установщик использует идентификатор пакета приложений и Spotlight для перемещения, поэтому для тестирования вы можете добавить папку сборки в список игнорирования Spotlight.

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

person catlan    schedule 03.08.2012

В вопросе, на который вы ссылаетесь, есть почти все, что вам нужно, чтобы полностью удалить 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 для изменения установщика.

person Quinn Taylor    schedule 26.04.2013

Создайте файл plist компонента, который имеет значение для перемещаемого свойства.

pkgbuild --analyze --root "$dst_src_root" "$installer_root/Components.plist"

Отредактируйте список компонентов и установите для параметра BundleIsRelocatable значение false. В моем проекте это делается один раз, так как содержимое установщика не меняется (одно приложение и один плагин). Я повторно использую один и тот же список компонентов каждый раз для создания пакета содержимого.

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, мы можем создать окончательный пакет

person Lakshmi    schedule 24.05.2019