注: これはOS Xインストーラパッケージのみ、提出用パッケージMac App Store異なるルールに従います。
マウンテンライオンのせいでゲートキーパー私はついにパッケージメーカー納屋の後ろでスクリプトをビルドして撮影します。PackageMaker はすでに Xcode から削除され、「Xcode の補助ツール」に移動されているため、すぐに忘れ去られるでしょう。
問題は、、、をどのように使用してpkgbuild
それproductbuild
をpkgutil
置き換えるかということです。
ベストアンサー1
このサンプルプロジェクトには、HelloWorld.appとHelper.appという2つのビルドターゲットがあります。コンポーネントパッケージそれぞれを組み合わせて製品アーカイブ。
あコンポーネントパッケージOS Xインストーラによってインストールされるペイロードが含まれています。コンポーネントパッケージは単独でインストールすることもできますが、通常は製品アーカイブ。
当社のツール:パッケージビルド、製品ビルド、 そしてpkgutil
「ビルドとアーカイブ」が成功したら、ターミナルで $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生成するコンポーネントパッケージデフォルトのプロパティを変更する必要がない場合は、--コンポーネント-plist次のコマンドのパラメータ。
製品ビルド --合成結果として分布定義。
$ 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 インストーラーDistribution.xml で何ができるか確認してください。次のコマンドで「Install iTunes.pkg」を抽出できます。
$ pkgutil --expand "Install iTunes.pkg" "Install iTunes"
まとめてみましょう
通常、プロジェクトには、Distribution.xml、component-plists、リソース、スクリプトなどが含まれる 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}"
生成されたパッケージを変更する必要がない場合は、製品ビルドpkgutil --expand
とステップを省くこともできますpkgutil --flatten
。また、- サインパラメータオン製品ビルド走る代わりに製品サイン。
OS Xインストーラーに署名する
パッケージには署名が付きます開発者IDインストーラー証明書は以下からダウンロードできます開発者証明書ユーティリティ。
署名は--sign "Developer ID Installer: John Doe"
次のパラメータで行われますパッケージビルド、製品ビルドまたは製品サイン。
署名済みのものを作成する場合は、製品アーカイブproductbuildを使用する場合、署名する理由はありませんコンポーネントパッケージ。
最後まで: パッケージをXcodeアーカイブにコピーする
Xcodeアーカイブに何かをコピーするには、スクリプトビルドフェーズの実行これには 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 スキーム情報が保存されていない場合は、これをシェル スクリプトとしてプロジェクトに追加することをお勧めします。これにより、ワークスペースからポストアクションにスクリプトをドラッグするだけで、アクションを簡単に復元できます。
スクリプト
スクリプトには 2 種類あります。配布定義ファイル内の JavaScriptおよびシェル スクリプト。
私が見つけたシェルスクリプトに関する最高のドキュメントはWhiteBox - PackageMakerの使い方ただし、これは古いパッケージ形式を参照しているため、注意して読んでください。
アップルシリコン
パッケージを arm64 として実行するには、Distribution ファイルのセクションで、以下に加えてhostArchitectures
サポートするものを指定する必要があります。arm64
x86_64
<options hostArchitectures="arm64,x86_64" />
追加資料
既知の問題と回避策
宛先選択ペイン
ユーザーには、インストール先の選択オプションが表示されますが、選択肢は「このコンピューターのすべてのユーザー向けにインストール」の 1 つだけです。このオプションは視覚的に選択されているように見えますが、インストールを続行するにはユーザーがそれをクリックする必要があり、混乱を招きます。
Apple のドキュメントでは使用を推奨しています<domains enable_anywhere ... />
が、これにより、Apple がどのパッケージでも使用していない、バグの多い新しい宛先選択ペインがトリガーされます。
非推奨を使用すると、<options rootVolumeOnly="true" />
古い宛先選択ペインが表示されます。
現在のユーザーのホーム フォルダーにアイテムをインストールします。
短い答え:試さないでください!
長い答え:本当に、試さないでください!読むインストーラーの問題と解決策これを読んだ後でも私が何をしたかわかりますか? 私はそれを試すほど愚かでした。10.7 または 10.8 で問題が修正されたはずだと自分に言い聞かせていました。
まず、私は時々、上記の宛先選択ペインのバグを目にしました。これで止めるべきだったのですが、私は無視しました。ソフトウェアをリリースした後、青い選択を一度クリックする必要があるサポート メールに返信するのに 1 週間を費やしたくない場合は、これを使用しないでください。
ユーザーはパネルを理解できるほど賢いと思っているのではないでしょうか。ホームフォルダのインストールに関するもう1つのことがあります。機能しない!
2 週間にわたって、OS バージョンなどが異なる 10 台ほどのマシンでテストしましたが、一度も失敗しませんでした。そこで、リリースしました。リリースから 1 時間以内に、インストールできないというユーザーから返信がありました。ログには、修正できない権限の問題が示唆されていました。
もう一度繰り返しますが、ホーム フォルダーのインストールにはインストーラーを使用しません。
Welcome、Read-me、License、およびConclusionのRTFDは、では受け入れられませんproductbuild
。
インストーラーは最初から、画像付きのきれいなウェルカム画面を作成するための RTFD ファイルをサポートしていましたが、productbuild はそれを受け入れません。
productbuild
回避策: ダミーの rtf ファイルを使用し、完了後にパッケージ内で置き換えます。
注: RTFD ファイル内に Retina 画像を含めることもできます。この場合は、マルチイメージ tiff ファイルを使用します。tiffutil -cat Welcome.tif Welcome_2x.tif -out FinalWelcome.tif
詳細詳細。
インストールが完了したらアプリケーションを起動しますバンドルポストインストールスクリプトパス脚本:
#!/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 パスまた、コマンドラインインストールではない場合にのみ実行します。インストーラツールまたはApple リモートデスクトップ。