グラフィカルなQtアプリケーションを Mac OS X のユーザーに配布する最良の方法を見つけようとしています。
pkgbuild、productbuildについて学び、それらを使用して拡張機能付きのフラット パッケージを作成しました。.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 を実行し、それに従ってパッケージをインストールします。
実行ls /Applications/abc.app
すると、アプリケーションが予期した場所にインストールされていないことがわかります。
ls -l staging
orを実行find . -uid root
すると、 のファイルstaging/abc.app
がすべて root ユーザーによって所有されていることがわかりますが、これは予期しないことです。
次に、ステージング ディレクトリを削除しsudo rm -rf staging
ます。パッケージのインストールを再試行してください。今回は、インストーラーがホーム ディレクトリにアプリを見つけられなかったため、正常に にインストールされました/Applications
。
代替案
アプリには実際に GUI とコマンド ライン コンポーネントがあり、その方法でコマンド ライン コンポーネントをユーザーのパスに配置するのは難しいため、.app
フォルダーをファイルにパッケージ化するだけには興味がありません。.dmg
フラット パッケージを使用すると、ファイルを に追加することで、コマンド ライン コンポーネントをパスに簡単に取得できます/etc/paths.d
。
Mac OS X フラット パッケージをオーサリングするためのより良いツールはありますか?
のソースコードはpkgbuild
入手できるので、それが何をしているのかを理解できますか?
この回答で説明されているより複雑な手順を試して、それが役立つかどうかを確認してください。