2

グラフィカルなQtアプリケーションを Mac OS X のユーザーに配布する最良の方法を見つけようとしています。

pkgbuildproductbuildについて学び、それらを使用して拡張機能付きのフラット パッケージを作成しました。.pkg

しかし、このようなフラット パッケージを Mac OS X 10.11 にインストールしようとすると、非常に奇妙な動作が見られます。これらのパッケージの Mac OS X インストーラーは、インストールしようとしているアプリケーションのホーム ディレクトリを検索するようです。そこにアプリケーションが見つかった場合、実際にはそのアプリケーションを盗み、それらのファイルの所有権をルートに変更し、インストールし/Applicationsたかったフォルダーにアプリケーションをインストールできません。

予想される動作は、パッケージが常にアプリケーションを/Applicationsディレクトリにインストールし、ホーム ディレクトリ内のファイルの所有権を変更しないことです。

これは本当に奇妙に思えます。何が起こっていて、どうすれば修正できますか? フラット パッケージは良さそうに見えますが、アプリケーションが常に適切な場所にインストールされることを保証したいので、ユーザーのホーム ディレクトリ内のファイルを変更することは避けたいと考えています。

問題を再現する手順

Homebrewをホーム ディレクトリにインストールします。

実行brew install qt5して Qt5 をインストールします。

次の 3 つのファイルを含む新しいディレクトリを作成します。

Info.plist.in :

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>CFBundleDevelopmentRegion</key>
    <string>en</string>
    <key>CFBundleExecutable</key>
    <string>main</string>
    <key>CFBundleIconFile</key>
    <string>app.icns</string>
    <key>CFBundleIdentifier</key>
    <string>com.example.abc.app</string>
    <key>CFBundleInfoDictionaryVersion</key>
    <string>6.0</string>
    <key>CFBundleName</key>
    <string>test thing</string>
    <key>CFBundlePackageType</key>
    <string>APPL</string>
    <key>CFBundleShortVersionString</key>
    <string>1.1.0</string>
    <key>CFBundleSignature</key>
    <string>????</string>
    <key>CFBundleVersion</key>
    <string>1.0.0</string>
    <key>NSHumanReadableCopyright</key>
    <string>public domain</string>
</dict>
</plist>

main.cpp :

#include <stdio.h>
int main(int argc, char *argv[])
{
  (void)argc; (void)argv;
  printf("hello\n");
  return 0;
}

test.sh :

c++ -isystem ~/opt/qt5/lib/QtCore.framework/Headers \
  ~/opt/qt5/lib/QtCore.framework/QtCore \
  main.cpp -o main

rm -rf "staging"
mkdir -p "staging/abc.app/Contents/"{MacOS,Resources}
cp main "staging/abc.app/Contents/MacOS/"
cp Info.plist.in "staging/abc.app/Contents/Info.plist"
"$(brew --prefix qt5)/bin/macdeployqt" "staging/abc.app"

pkgbuild --identifier com.example.abc.pkg \
  --version 1.0.0 \
  --root staging \
  --install-location /Applications \
  app.pkg

./test.shターミナルに入力して test.sh を実行します。私のコンピューターでは、出力は次のようになります。

pkgbuild: Inferring bundle components from contents of staging
pkgbuild: Adding component at abc.app
pkgbuild: Adding component at abc.app/Contents/Frameworks/QtWidgets.framework
pkgbuild: Adding component at abc.app/Contents/Frameworks/QtGui.framework
pkgbuild: Adding component at abc.app/Contents/Frameworks/QtCore.framework
pkgbuild: Adding component at abc.app/Contents/Frameworks/QtPrintSupport.framework
pkgbuild: Wrote package to app.pkg

(明らかに、pkgbuild は私のステージング フォルダー内のコンポーネントを検出しています。私はそれが行われないことを望みます。単純に、これらすべてのファイルをユーザーの/Applicationsディレクトリにインストールすることを望んでいます。ファイルがあるという理由だけでファイルを特別に扱う場合Info.plist、それはおそらく悪いこと。)

open app.pkg次に、画面上の GUI を実行し、それに従ってパッケージをインストールします。

Mac OS X フラット パッケージの標準 UI

実行ls /Applications/abc.appすると、アプリケーションが予期した場所にインストールされていないことがわかります。

ls -l stagingorを実行find . -uid rootすると、 のファイルstaging/abc.appがすべて root ユーザーによって所有されていることがわかりますが、これは予期しないことです。

次に、ステージング ディレクトリを削除しsudo rm -rf stagingます。パッケージのインストールを再試行してください。今回は、インストーラーがホーム ディレクトリにアプリを見つけられなかったため、正常に にインストールされました/Applications

代替案

アプリには実際に GUI とコマンド ライン コンポーネントがあり、その方法でコマンド ライン コンポーネントをユーザーのパスに配置するのは難しいため、.appフォルダーをファイルにパッケージ化するだけには興味がありません。.dmgフラット パッケージを使用すると、ファイルを に追加することで、コマンド ライン コンポーネントをパスに簡単に取得できます/etc/paths.d

Mac OS X フラット パッケージをオーサリングするためのより良いツールはありますか?

のソースコードはpkgbuild入手できるので、それが何をしているのかを理解できますか?

この回答で説明されているより複雑な手順を試して、それが役立つかどうかを確認してください。

4

1 に答える 1