我的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文件夹最终不会显示。我想知道这里会发生什么?
最初我们将帮助应用程序作为主应用程序放在一个单独的目录中,在这种情况下,帮助应用程序有时不会安装,但主应用程序总是会安装。接下来,我们尝试将帮助应用程序放在主应用程序中,然后这是第一次工作,但下次我尝试从安装程序安装主应用程序不在那里!
答案 0 :(得分:13)
我遇到了大致相同的问题。 OS X安装程序似乎使用有关已安装的软件包和应用程序软件包的信息来决定安装新软件包的位置和安装方式。因此,有时我的安装程序没有安装任何任何文件,有时它只是覆盖了我的构建树中的.app包。不一定是用于构建安装程序的那个,而是OS X找到的任何.app包。为了让安装程序正确安装文件,我必须做两件事:
告诉OS X忘记已安装的软件包
sudo pkgutil --forget <package id>
不确定这是否需要你,或者我的情况,但无论如何它可能是。
删除应用的所有现有.app包。如果我没有这样做,则在安装时覆盖现有的应用程序包,而不是将应用程序放在/ Applications中。也许在构建安装程序包时有一种方法可以防止这种情况,但我还没有找到它。
如果可以,您可能应该尝试使应用程序自包含,以便用户只需将其拖放到/ Applications中即可安装它。当然,只有在您不需要在.app包之外安装任何东西时,这才有效。
答案 1 :(得分:6)
如果你不想(或不能指望其他用户)按照villintehaspam的描述追捕和删除应用程序的所有现有副本,或者只是真的需要不重新定位应用程序,你可以提供一个将BundleIsRelocatable
设置为false的组件属性列表文件。
创建plist文件的有效版本的简便方法是使用pkgbuild --analyze
;然后你可以编辑一个属性并使用该文件。 E.g:
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