安装时忽略产品构建路径
productbuild path ignored on install
我有一个使用 Qt 构建的 OSX 应用程序。它经过代码签名、打包以适合 mac 商店,并已获得 Apple 批准,可以在 mac 商店出售。
虽然在安装之后,它被安装到它在打包过程中所在的位置,而不是 /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 应用商店安装应用程序,但效果相同...它进入了错误的路径。
我用过:
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">
知道哪里出了问题吗?我尝试 google 寻求解决方案,但没有成功。这个不正确的路径可以存储在哪里?在 productbuild 之前,我没有看到嵌入到任何文件中的路径。 productbuild 是不是在做一些奇怪的事情?
我想我终于有了一个解释。
它在除我们的构建机器之外的所有其他机器上都能正确安装。原因似乎是在你从文件系统的任何地方执行命名的 MyApp.app 之后 osx 记住了那个路径。因此,当您下次尝试安装它(更新?)时,它将更新已知路径上的应用程序。
一个更奇怪的情况是,当您有两个 "installations" 应用程序(两个副本)并且您尝试再次安装它时,它会在两个实例之间交替安装它!闻起来像个错误,Apple 永远不会修复。
感谢@l'L'l 的帮助。如果你能向我解释这种行为,那将是一个加号。
我也 运行 参与其中,我发现绕过它的唯一方法是使用中间 pkgbuild
步骤,使用 component-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
然后是产品构建步骤。
键实际上是 components.plist
中的 BundleIsRelocatable
-键,值为 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>
我有一个使用 Qt 构建的 OSX 应用程序。它经过代码签名、打包以适合 mac 商店,并已获得 Apple 批准,可以在 mac 商店出售。
虽然在安装之后,它被安装到它在打包过程中所在的位置,而不是 /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 应用商店安装应用程序,但效果相同...它进入了错误的路径。
我用过:
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">
知道哪里出了问题吗?我尝试 google 寻求解决方案,但没有成功。这个不正确的路径可以存储在哪里?在 productbuild 之前,我没有看到嵌入到任何文件中的路径。 productbuild 是不是在做一些奇怪的事情?
我想我终于有了一个解释。
它在除我们的构建机器之外的所有其他机器上都能正确安装。原因似乎是在你从文件系统的任何地方执行命名的 MyApp.app 之后 osx 记住了那个路径。因此,当您下次尝试安装它(更新?)时,它将更新已知路径上的应用程序。
一个更奇怪的情况是,当您有两个 "installations" 应用程序(两个副本)并且您尝试再次安装它时,它会在两个实例之间交替安装它!闻起来像个错误,Apple 永远不会修复。
感谢@l'L'l 的帮助。如果你能向我解释这种行为,那将是一个加号。
我也 运行 参与其中,我发现绕过它的唯一方法是使用中间 pkgbuild
步骤,使用 component-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
然后是产品构建步骤。
键实际上是 components.plist
中的 BundleIsRelocatable
-键,值为 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>