Подтвердить что ты не робот

Портирование установщика сборки командной строки 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?

4b9b3361

Ответ 1

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

  1. Запустите исполняемый файл командной строки packagemaker в специальной структуре каталогов. Эта структура каталогов отражает файловую систему Mac. Читайте больше в старом, но надежном руководстве "PackageMaker How-to".
  2. Запустите pkgutil (pkgutil --expand), чтобы извлечь содержимое пакета
  3. Посмотрите на содержимое и определите, что вы хотите изменить. Некоторые параметры - приветственное сообщение, лицензия и фоновое изображение.
  4. Добавьте команды для изменения этих файлов через командную строку. Обратитесь к руководству "Автоматизация Apple PackageMaker" для получения дополнительной информации. Самый простой способ - просто запустить что-то вроде этого echo '<background file="your_background.png">'.
  5. Запустите 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, мы можем создать окончательный пакет