Создание пакетов установщика OS X, таких как Pro-Xcode Developer ID ready pkg

Примечание: это для установщик OS X только пакеты, пакеты для отправки в Mac App Store следуют различным правилам.

из-за пумы сторож мне, наконец, пришлось взять мой PackageMaker построить сценарий за сараем и снимать его. PackageMaker уже был удален из Xcode и перемещен в "вспомогательные инструменты для Xcode", поэтому, надеюсь, он скоро будет забыт.

вопрос в том, как Я использую pkgbuild, productbuild и pkgutil заменить его?

5 ответов


наш пример проекта имеет две цели сборки: HelloWorld.приложение и помощник.приложение. Мы делаем компонент пакета для каждого и объединить их в архив продукции.

A компонент пакета содержит полезную нагрузку для установки установщиком OS X. Хотя компонент пакет может быть установлен самостоятельно, он обычно включен в архив продукции.

наши инструменты: пакета текущим, productbuild и pkgutil

после успешной "сборки и архивирования" откройте $BUILT_PRODUCTS_DIR в терминале.

$ cd ~/Library/Developer/Xcode/DerivedData/.../InstallationBuildProductsLocation
$ pkgbuild --analyze --root ./HelloWorld.app HelloWorldAppComponents.plist
$ pkgbuild --analyze --root ./Helper.app HelperAppComponents.plist

это дает нам компонент-plist, вы найдете описание значения в "Список Свойств Компонента". pkgbuild-root создает компоненты пакета, если вам не нужно изменять какие-либо свойства по умолчанию можно опустить --component-plist параметр в следующей команде.

productbuild --синтезировать результаты Определение Распределения.

$ pkgbuild --root ./HelloWorld.app \
    --component-plist HelloWorldAppComponents.plist \
    HelloWorld.pkg
$ pkgbuild --root ./Helper.app \
    --component-plist HelperAppComponents.plist \
    Helper.pkg
$ productbuild --synthesize \
    --package HelloWorld.pkg --package Helper.pkg \
    Distribution.xml 

на рассылки.в XML вы можете изменить такие вещи, как название, фон, добро пожаловать, readme, лицензия и так далее. Ты поворачиваешь свой компоненты пакета и определение распределения с этой командой в товар архив:

$ productbuild --distribution ./Distribution.xml \
    --package-path . \
    ./Installer.pkg

я рекомендую взглянуть на установщики iTunes рассылки.xml, чтобы увидеть, что возможно. Вы можете извлечь " установить iTunes.ПКГ" с:

$ pkgutil --expand "Install iTunes.pkg" "Install iTunes"

давайте вместе

у меня обычно есть папка с именем Package в моем проекте, которая включает такие вещи, как распространение.xml, component-plists, ресурсы и скрипты.

добавить Запустить Этап Сборки Скрипта С именем " создать пакет", который установлен в выполнить скрипт только при установке:

VERSION=$(defaults read "${BUILT_PRODUCTS_DIR}/${FULL_PRODUCT_NAME}/Contents/Info" CFBundleVersion)

PACKAGE_NAME=`echo "$PRODUCT_NAME" | sed "s/ /_/g"`
TMP1_ARCHIVE="${BUILT_PRODUCTS_DIR}/$PACKAGE_NAME-tmp1.pkg"
TMP2_ARCHIVE="${BUILT_PRODUCTS_DIR}/$PACKAGE_NAME-tmp2"
TMP3_ARCHIVE="${BUILT_PRODUCTS_DIR}/$PACKAGE_NAME-tmp3.pkg"
ARCHIVE_FILENAME="${BUILT_PRODUCTS_DIR}/${PACKAGE_NAME}.pkg"

pkgbuild --root "${INSTALL_ROOT}" \
    --component-plist "./Package/HelloWorldAppComponents.plist" \
    --scripts "./Package/Scripts" \
    --identifier "com.test.pkg.HelloWorld" \
    --version "$VERSION" \
    --install-location "/" \
    "${BUILT_PRODUCTS_DIR}/HelloWorld.pkg"
pkgbuild --root "${BUILT_PRODUCTS_DIR}/Helper.app" \
    --component-plist "./Package/HelperAppComponents.plist" \
    --identifier "com.test.pkg.Helper" \
    --version "$VERSION" \
    --install-location "/" \
    "${BUILT_PRODUCTS_DIR}/Helper.pkg"
productbuild --distribution "./Package/Distribution.xml"  \
    --package-path "${BUILT_PRODUCTS_DIR}" \
    --resources "./Package/Resources" \
    "${TMP1_ARCHIVE}"

pkgutil --expand "${TMP1_ARCHIVE}" "${TMP2_ARCHIVE}"

# Patches and Workarounds

pkgutil --flatten "${TMP2_ARCHIVE}" "${TMP3_ARCHIVE}"

productsign --sign "Developer ID Installer: John Doe" \
    "${TMP3_ARCHIVE}" "${ARCHIVE_FILENAME}"

Если вам не нужно менять пакет после его создания с помощью productbuild вы могли бы избавиться от pkgutil --expand и pkgutil --flatten действия. Также вы можете использовать --знак paramenter on productbuild вместо productsign.

подписать установщик OS X

пакеты подписываются с разработчику ID Installer сертификат, который вы можете скачать с Утилита Сертификата Разработчика.

они подписывают делается с или Apple Remote Desktop.



есть одно очень интересное приложение от Stéphane Sudre, которое делает все это для вас, является сценарием / поддерживает построение из командной строки, имеет супер хороший графический интерфейс и является бесплатным. Грустно: это называется "пакеты", что делает невозможным найти в google.

http://s.sudre.free.fr/Software/Packages/about.html

жаль, что я не знал об этом до того, как начал создавать свои собственные сценарии.

Packages application screenshot


вот скрипт сборки который создает подписанный пакет установщика из корня сборки.

#!/bin/bash
# TRIMCheck build script
# Copyright Doug Richardson 2015
# Usage: build.sh
#
# The result is a disk image that contains the TRIMCheck installer.
#

DSTROOT=/tmp/trimcheck.dst
SRCROOT=/tmp/trimcheck.src

INSTALLER_PATH=/tmp/trimcheck
INSTALLER_PKG="TRIMCheck.pkg"
INSTALLER="$INSTALLER_PATH/$INSTALLER_PKG"

#
# Clean out anything that doesn't belong.
#
echo Going to clean out build directories
rm -rf build $DSTROOT $SRCROOT $INSTALLER_PATH
echo Build directories cleaned out


#
# Build
#
echo ------------------
echo Installing Sources
echo ------------------
xcodebuild -project TRIMCheck.xcodeproj installsrc SRCROOT=$SRCROOT || exit 1

echo ----------------
echo Building Project
echo ----------------
pushd $SRCROOT
xcodebuild -project TRIMCheck.xcodeproj -target trimcheck -configuration Release install || exit 1
popd

echo ------------------
echo Building Installer
echo ------------------
mkdir -p "$INSTALLER_PATH" || exit 1

echo "Runing pkgbuild. Note you must be connected to Internet for this to work as it"
echo "has to contact a time server in order to generate a trusted timestamp. See"
echo "man pkgbuild for more info under SIGNED PACKAGES."
pkgbuild --identifier "com.delicioussafari.TRIMCheck" \
    --sign "Developer ID Installer: Douglas Richardson (4L84QT8KA9)" \
    --root "$DSTROOT" \
    "$INSTALLER" || exit 1


echo Successfully built TRIMCheck
open "$INSTALLER_PATH"

exit 0

A +1 к принятому ответу:

выбор места назначения в установщике

если домен (a.к. пункт назначения) выбор между доменом пользователя и системным доменом, а не пытаться <domains enable_anywhere="true"> использовать следующий:

<domains enable_currentUserHome="true" enable_localSystem="true"/>

enable_currentUserHome устанавливает приложение приложения под ~/Applications/ и enable_localSystem позволяет приложению быть установленным под /Application

Я пробовал это в El Capitan 10.11.6 (15G1217), и, похоже, отлично работать в 1 dev машине и 2 разных VMs, которые я пробовал.


FYI для тех, кто пытается создать установщик пакетов для пакета или плагина, это легко:

pkgbuild --component "Color Lists.colorPicker" --install-location ~/Library/ColorPickers ColorLists.pkg