Создание пакетов установщика 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. Хотя компонент пакет может быть установлен сам по себе, он обычно включен в архив продукции.
наши инструменты: pkgbuild, 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, компонентные списки, ресурсы и скрипты.
добавить Запустить Этап Сборки Скрипта С именем " создать пакет", который установлен в выполнить скрипт только при установке:
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действия. Также вы можете использовать --sign paramenter on productbuild вместо productsign.подписать установщик OS X
пакеты подписываются с помощью разработчику Идентификатор установщика сертификат, который вы можете скачать с Утилита Сертификата Разработчика.
их подписание осуществляется с помощью или 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.k.a destination) выбор желателен между пользовательским доменом и системным доменом, то вместо того, чтобы пытаться
<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 разных виртуальных машинах, которые я пробовал.
FYI для тех, кто пытается создать установщик пакетов для пакета или плагина, это просто:
pkgbuild --component "Color Lists.colorPicker" --install-location ~/Library/ColorPickers ColorLists.pkg

Comments