【问题标题】:productbuild path ignored on install安装时忽略 productbuild 路径
【发布时间】:2016-08-11 01:04:58
【问题描述】:

我有一个用 Qt 构建的 OSX 应用程序。它经过代码设计、打包以适合 macstore,并已获得苹果的批准,可以在 mac store 上销售。

虽然在安装后,它会安装到打包过程中它所在的位置,而不是 /Applications。

或者,我正在创建文件的 .dmg 包,我可以将其安装到 /Applications 中。

在构建过程结束时,我正在运行这些命令:

codesign --force --deep --verify MyApp.app/ --entitlements ${INSTDIR}/Entitlements.plist -s "3rd Party Mac Developer Application: Company Name"
productbuild --component MyApp.app /Applications --sign "3rd Party Mac Developer Installer: Company Name" MyApp.pkg

结果是我试图通过安装程序安装的 pkg:

$ sudo installer -store -pkg MyApp.pkg -target /
installer: Note: running installer as an admin user (instead of root) gives better Mac App Store fidelity
installer: MyApp.pkg has valid signature for submission: 3rd Party Mac Developer Installer: Company Name (key)
installer: Installation Check: Passed
installer: Volume Check: Passed
installer: Bundle com.CompanyName.MyApp will be relocated to /Users/peti/dev/build/bin/Mac/release/MyApp.app
installer: Starting install
installer: Install 0.0% complete
installer: Install 17.1% complete
installer: Install 96.4% complete
installer: Install 100.0% complete
installer: Finished install

在 productbuild 之后,重定位是说 /Applications,但它没有在那里安装它!在随后的运行中,它会说错误的路径。我也尝试过从不同位置安装。

我也尝试从 Mac Store 安装应用程序,它的作用相同...它进入了不正确的路径。

我用过:

pkgutil --expand

提取包。 PackageInfo 文件是这样说的:

<pkg-info overwrite-permissions="true" relocatable="false" identifier="com.CompanyName.MyApp" postinstall-action="none" version="3.0.0" format-version="2" generator-version="InstallCmds-502 (14F1605)" install-location="/Applications" auth="root" preserve-xattr="true">

有什么想法可能会出错吗?我试图用谷歌搜索解决方案,但没有运气。这个不正确的路径可以存储在哪里?在 productbuild 之前,我没有看到嵌入到任何文件中的路径。 productbuild 是否在做一些奇怪的事情?

【问题讨论】:

  • .dmg 是磁盘映像,不是包,但你当然可以在上面存储一个.pkg
  • @I'L'I 我明白了,我不明白为什么打包的地方和安装路径有关系。
  • 如果你的意思是构建文件时文件所在的位置,那是因为它使用它来确定安装位置。
  • @I'L'I 嗯,为什么?如上所述,我明确表示安装目标是 /Applications 的 productbuild。你能详细说明一下吗?
  • 尝试构建您的应用程序,然后执行mv MyApp.app /Applications。尝试cp -r 一个应用程序包可能会搞砸。

标签: macos qt productbuild


【解决方案1】:

最后我想我有一个解释。

它可以正确安装在除我们的构建机器之外的所有其他机器上。原因似乎是在您从文件系统上的任何位置执行命名的 MyApp.app 后,osx 会记住该路径。因此,当您下次尝试安装它(更新?)时,它将更新已知路径上的应用程序。

更奇怪的情况是,当您有两个“安装”应用程序(两个副本)并且您尝试再次安装它时,它会在两个实例之间交替安装它!闻起来像一个错误,Apple 永远不会修复。

感谢@l'L'l 的帮助。如果您能向我解释这种行为,那就太好了。

【讨论】:

    【解决方案2】:

    我也遇到了这个问题,我发现解决它的唯一方法是在过程中使用中间的pkgbuild 步骤,使用组件-plist 文件 (components.plist)。

    下面的命令假定一个名为 Applications 的目录包含当前目录中存在的构建产品(应用程序)以及文件components.plist。它将结果写入ApplicationPackage.pkg

    $ > pkgbuild --root ./Applications --component-plist ./components.plist --identifier "com.company.app.pkg" --install-location /Application ApplicationPackage.pkg
    

    然后是产品构建步骤。

    Key 实际上是components.plist 中的BundleIsRelocatable-key,其值为false

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
    <array>
        <dict>
            <key>BundleHasStrictIdentifier</key>
            <true/>
            <key>BundleIsRelocatable</key>
            <false/>
            <key>BundleIsVersionChecked</key>
            <true/>
            <key>BundleOverwriteAction</key>
            <string>upgrade</string>
            <key>RootRelativeBundlePath</key>
            <string>AppBundle.app</string>
        </dict>
    </array>
    </plist>
    

    【讨论】:

      猜你喜欢
      • 2013-12-22
      • 2017-07-16
      • 1970-01-01
      • 1970-01-01
      • 2015-12-29
      • 2011-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多