我的 Java 应用程序有一个启动器,它是一个 .app 和一个与之捆绑在一起的帮助应用程序。
我正在尝试使用以下命令制作带有背景图像的 .pkg 安装程序:
pkgbuild --root "./Temp" --identifier "com.company.id" --install-location "/Applications" --sign "signature" "temp.pkg"
productbuild --package-path "temp.pkg" --distribution "./Distribution.xml" --package-path "./Temp" --resources "./Resources" --sign "installer signature" "$FINAL_PKG"
当我查看 ./Temp 的目录时,两个 .app 文件夹都在那里,当我用以下命令解构 .pkg 时:
pkgutil --expand "temp.pkg" "temp"
我看到 .app 文件夹,但有时从 pkg 安装时,其中一个 .app 文件夹不会显示。它们似乎总是在第一次安装时出现,但在多次安装和删除应用程序的计算机上(例如在测试和开发计算机上),其中一个 .app 文件夹最终将不会显示。我想知道这里会发生什么?
最初,我们将辅助应用程序作为主应用程序放在一个单独的目录中,在这种情况下,辅助应用程序有时不会安装,但主应用程序始终会安装。接下来,我们尝试将辅助应用程序放入主应用程序中,然后第一次工作,但下次我尝试从安装程序安装时,主应用程序不在那里!
我也遇到过大致相同的问题。 OS X 安装程序似乎使用有关已安装的软件包和应用程序包的信息来决定在何处以及是否安装新软件包。因此,有时我的安装程序没有安装任何任何文件,有时它只是覆盖了我的构建树中的 .app 包。不一定是用于构建安装程序的包,而是 OS X 找到的任何 .app 包。为了让安装程序正确安装文件,我必须做两件事:
告诉 OS X 忘记已安装的软件包
sudo pkgutil --forget <package id>
不确定您或我的情况是否需要这样做,但无论如何,这可能是个好主意。删除应用程序的all现有 .app 捆绑包。如果我不这样做,现有的应用程序包将在安装时被覆盖,而不是将应用程序放置在 /Applications 中。也许在构建安装程序包时有一种方法可以防止这种情况,但我还没有找到。
如果可以的话,您可能应该尝试使您的应用程序自包含,以便用户只需将其拖放到 /Applications 即可安装它。当然,只有当您不需要安装 .app 捆绑包之外的任何内容时,这才有效。
如果您不想(或不能期望其他用户)按照 villintehaspam 的描述查找并删除应用程序的所有现有副本,或者只是确实需要不重新定位应用程序,您可以提供组件属性列出
BundleIsRelocatable
设置为 false 的文件。
创建 plist 文件的有效版本的简单方法是使用
pkgbuild --analyze
;然后您可以编辑一个属性并使用该文件。 例如:
pkgbuild --root myapp.root --analyze myapp.plist
/usr/libexec/PlistBuddy -c 'set :Dict:BundleIsRelocatable false' myapp.plist
pkgbuild --root myapp.root --component-plist myapp.plist [...other options...] myapp.pkg
经过2天的尝试和搜索,我发现其他文件夹中有一个.app文件。我刚刚删除了该文件并运行了安装程序,一切正常。