開発者IDに対応したmacOSインストーラーパッケージの作成 質問する

開発者IDに対応したmacOSインストーラーパッケージの作成 質問する

注: これはOS Xインストーラパッケージのみ、提出用パッケージMac App Store異なるルールに従います。

マウンテンライオンのせいでゲートキーパー私はついにパッケージメーカー納屋の後ろでスクリプトをビルドして撮影します。PackageMaker はすでに Xcode から削除され、「Xcode の補助ツール」に移動されているため、すぐに忘れ去られるでしょう。

問題は、、、をどのように使用してpkgbuildそれproductbuildpkgutil置き換えるかということです。

ベストアンサー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サポートするものを指定する必要があります。arm64x86_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 リモートデスクトップ


おすすめ記事