Создание пакетов установщика 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
жаль, что я не знал об этом до того, как начал создавать свои собственные сценарии.
вот скрипт сборки который создает подписанный пакет установщика из корня сборки.
#!/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