【问题标题】:OSX .pkg installer sometimes does not install .app fileOSX .pkg 安装程序有时不安装 .app 文件
【发布时间】:2013-10-17 12:17:22
【问题描述】:

我的 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 文件夹,但有时其中一个 .app 文件夹在从 pkg 安装时不会显示。它们似乎总是在第一次安装时出现,但在多次安装和删除应用程序的机器上(如在测试和开发机器上),其中一个 .app 文件夹最终不会出现。我想知道这里会发生什么?

最初,我们将辅助应用程序作为主应用程序放在一个单独的目录中,在这种情况下,辅助应用程序有时不会被安装,但主应用程序总是会安装。接下来,我们尝试将帮助应用程序放在主应用程序中,然后第一次工作,但下次我尝试从安装程序安装时,主应用程序不存在!

【问题讨论】:

    标签: macos installation productbuild pkgbuild


    【解决方案1】:

    我遇到了大致相同的问题。 OS X 安装程序似乎使用有关已安装软件包和应用程序包的信息来决定在何处以及是否安装新软件包。结果,有时我的安装程序没有安装任何 任何 文件,有时它只是覆盖了我的构建树中的 .app 包。不一定是用于构建安装程序的那个,而是 OS X 找到的任何 .app 包。为了让安装程序正确安装文件,我必须做两件事:

    1. 告诉 OS X 忘记安装的包

      sudo pkgutil --forget <package id> 不确定这是否对你和我的情况都需要,但无论如何这可能是个好主意。

    2. 删除 所有 应用的现有 .app 包。如果我不这样做,现有的应用程序包会在安装时被覆盖,而不是应用程序被放置在 /Applications 中。也许在构建安装程序包时有一种方法可以防止这种情况发生,但我还没有找到。

    如果可以,您可能应该尝试使您的应用程序自包含,以便用户只需将其拖放到 /Applications 即可安装它。当然,这只适用于您不需要在 .app 包之外安装任何东西的情况。

    【讨论】:

      【解决方案2】:

      如果您不想(或不能指望其他用户)按照 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
      

      【讨论】:

      • pkgbuild 组件 plist 格式肯定发生了变化,因为您使用的 PlistBuddy 命令不再起作用。我必须使用/usr/libexec/PlistBuddy -c 'set :0:BundleIsRelocatable false' myapp.plist 才能使安装程序实际将我的应用安装到 /Applications 文件夹。
      • 哇。我完全误读了那些调试行,并试图找出installer 在哪里写入文件。关于BundleIsRelocatable 的行就是它的作用。谢谢!
      • 如果你不想安装PlistBuddy有一个内置的plutil来修改属性列表 --> plutil -replace BundleIsRelocatable -bool NO Info.plist
      猜你喜欢
      • 1970-01-01
      • 2017-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-10
      • 2016-01-08
      • 2012-02-28
      • 1970-01-01
      相关资源
      最近更新 更多