サンプルプロジェクトには、HelloWorld.appとHelper.appの2つのビルドターゲットがあります。それぞれのコンポーネントパッケージを作成し、それらを製品アーカイブに結合します。
コンポーネントパッケージは、 OS Xインストーラによりインストールされるペイロードを含みます。コンポーネントパッケージは単独でインストールできますが、通常は製品アーカイブに組み込まれます。
「ビルドとアーカイブ」が成功したら、ターミナルで$ BUILT_PRODUCTS_DIRを開きます。
$ cd ~/Library/Developer/Xcode/DerivedData/.../InstallationBuildProductsLocation
$ pkgbuild --analyze --root ./HelloWorld.app HelloWorldAppComponents.plist
$ pkgbuild --analyze --root ./Helper.app HelperAppComponents.plist
これにより、component-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
Distribution.xmlでは、タイトル、背景、ウェルカム、readme、ライセンスなどを変更できます。あなたは、あなたのターンのコンポーネントパッケージ Aには、このコマンドを使用して、流通の定義を製品アーカイブ:
$ productbuild --distribution ./Distribution.xml \
--package-path . \
./Installer.pkg
私は見てみることをお勧めします iTunes Installers Distribution.xmlを見て、何が可能かを確認。「Install iTunes.pkg」は次のようにして抽出できます。
$ pkgutil --expand "Install iTunes.pkg" "Install iTunes"
まとめましょう
通常、プロジェクトにはPackageという名前のフォルダーがあり、Distribution.xml、component-plists、リソース、スクリプトなどが含まれています。
「Generate Package」という名前の実行スクリプトビルドフェーズを追加します。これは、インストール時にのみスクリプトを実行するように設定されています。
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
ステップとステップを取り除くことができます。また、productsignを実行する代わりに、productbuildで--sign パラメータを使用することもできます。
OS Xインストーラーに署名する
パッケージは、開発者証明書ユーティリティからダウンロードできる開発者IDインストーラー証明書で署名されています。
それらの署名は--sign "Developer ID Installer: John Doe"
、pkgbuild、productbuildまたはproductsignのパラメーターで行われます。
productbuildを使用して署名付きの製品アーカイブを作成する場合は、コンポーネントパッケージに署名する必要はありません。
すべての方法:パッケージをXcodeアーカイブにコピー
Xcode Archiveに何かをコピーするために、Run Script Build Phaseを使用することはできません。そのためには、Schemeアクションを使用する必要があります。
スキームを編集してアーカイブを展開します。次に、ポストアクションをクリックして、新しいスクリプト実行アクションを追加します。
Xcode 6の場合:
#!/bin/bash
PACKAGES="${ARCHIVE_PATH}/Packages"
PACKAGE_NAME=`echo "$PRODUCT_NAME" | sed "s/ /_/g"`
ARCHIVE_FILENAME="$PACKAGE_NAME.pkg"
PKG="${OBJROOT}/../BuildProductsPath/${CONFIGURATION}/${ARCHIVE_FILENAME}"
if [ -f "${PKG}" ]; then
mkdir "${PACKAGES}"
cp -r "${PKG}" "${PACKAGES}"
fi
Xcode 5では、PKG
代わりにこの値を使用します。
PKG="${OBJROOT}/ArchiveIntermediates/${TARGET_NAME}/BuildProductsPath/${CONFIGURATION}/${ARCHIVE_FILENAME}"
バージョンコントロールにXcodeスキーム情報が保存されていない場合は、これをシェルスクリプトとしてプロジェクトに追加して、スクリプトをワークスペースからポストアクションにドラッグするだけでアクションを簡単に復元できるようにすることをお勧めします。
スクリプティング
スクリプトには、配布定義ファイルのJavaScriptとシェルスクリプトの2種類があります。
WhiteBox-PackageMaker How-toで見つけたシェルスクリプトに関する最良のドキュメントですが、古いパッケージフォーマットを参照しているため、注意して読んでください。
追加の読書
既知の問題と回避策
宛先選択ペイン
ユーザーには、「このコンピューターのすべてのユーザー用にインストールする」という単一の選択肢のみを持つ宛先選択オプションが表示されます。オプションは視覚的に選択されたように見えますが、ユーザーはインストールを続行するためにそれをクリックする必要があるため、混乱が生じます。
Apples Documentationを使用することをお勧めします<domains enable_anywhere ... />
が、これにより、Appleがパッケージで使用しない、よりバグの多いDestination Select Paneがトリガーされます。
非推奨<options rootVolumeOnly="true" />
を使用すると、古い宛先選択ペインが表示されます。
現在のユーザーのホームフォルダーにアイテムをインストールします。
短い答え:試さないでください!
長い答え:本当に; 試さないでください!インストーラーの問題と解決策を読む。これを読んでも私が何をしたか知ってる?私はそれを試すのに十分なほど愚かでした。彼らが10.7または10.8で問題を修正したと確信しています。
まず最初に、上記の宛先選択ペインのバグを時々見ました。それは私を止めるべきでしたが、私はそれを無視しました。ソフトウェアをリリースしてから1週間を費やしたくない場合は、サポート用の電子メールに返信して、青色の選択項目を1回クリックする必要があります。これは使用しないでください。
あなたは今、ユーザーがパネルを理解するのに十分賢いと考えていますね。ここで、ホームフォルダーのインストールに関するもう1つのことは、機能しません。
OSのバージョンが異なる約10種類のマシンで2週間テストしましたが、失敗したことはありませんでしたが、失敗することはありませんでした。発送しました。リリースから1時間以内に、それをインストールできなかったユーザーから心を奪われました。修正できない権限の問題を示唆するログ。
もう一度繰り返しましょう。ホームフォルダーのインストールにはインストーラーを使用しません。
Welcome、Read-me、License and ConclusionのRTFDはで受け入れられませんproductbuild
。
インストーラーは、画像付きのウェルカム画面を作成するRTFDファイルを最初からサポートしていますが、productbuildはそれらを受け入れません。
回避策:ダミーのrtfファイルを使用し、パッケージ内でそれを後で置き換えますproductbuild
。
注:RTFDファイル内にRetinaイメージを含めることもできます。これにはマルチイメージのtiffファイルを使用しますtiffutil -cat Welcome.tif Welcome_2x.tif -out FinalWelcome.tif
。その他の詳細。
BundlePostInstallScriptPathスクリプトを使用してインストールが完了したときにアプリケーションを開始する:
#!/bin/bash
LOGGED_IN_USER_ID=`id -u "${USER}"`
if [ "${COMMAND_LINE_INSTALL}" = "" ]
then
/bin/launchctl asuser "${LOGGED_IN_USER_ID}" /usr/bin/open -g PATH_OR_BUNDLE_ID
fi
exit 0
インストーラーユーザーとしてではなく、ログインユーザーとしてアプリを実行することが重要です。これは、launchctl asuser uid pathで行われます。また、インストーラーツールまたはApple Remote Desktopを使用して、コマンドラインインストールでない場合にのみ実行します。