0

我遇到了一个奇怪的问题,我的安装程序正确地覆盖了以前安装的应用程序,但随后又覆盖了我的构建目录中的应用程序。

我的安装程序构建如下所示:

mkdir /tmp/foo
cp -R ~/Projects/MyApp/Builds/MacOSX/build/Release/MyApp.app /tmp/foo
pkgbuild  --quiet  --analyze --root /tmp/foo/  MyApp.plist

pkgbuild  --quiet --root /tmp/foo/  \
 --component-plist MyApp.plist \
 --identifier com.mycompany.myapp \
 --version $VERSION \
 --install-location "/Applications" \
 MyApp.pkg

productbuild  --quiet --distribution "./Distribution.xml" \
 --package-path "./" --resources "./Resources" \
 --sign "Developer ID Installer: My LLC" "MyApp Installer.pkg"

现在,这可以工作了……它按照我的预期将应用程序安装在 /Applications 文件夹中。但我注意到我的下一个 Xcode 版本存在一些问题。经过一番调查,我注意到我的构建文件夹在 Xcode 构建之后和运行安装程序之前看起来像这样:

drwxr-xr-x@ 3 me staff 96 Jul 11 23:15 My.app

…像这样,运行安装程序后:

drwxr-xr-x 3 root wheel 96 Jul 11 23:44 My.app

不知何故,我的应用程序的所有者发生了变化。我仔细检查了所有内容,没有看到任何触及我的构建文件夹的内容。但后来我检查了安装程序日志,发现了这条神秘的线:

PackageKit: Applications/MyApp.app relocated to 
  Users/me/Projects/MyApp/Builds/MacOSX/build/Release/MyApp.app

经过一番谷歌搜索后,其他人推测安装程序会覆盖它在驱动器上任何位置找到的任何应用程序副本……而不仅仅是您告诉它的文件夹中的那个。这是有道理的……如果我在构建文件夹中删除我的应用程序的副本,安装程序不会创建一个新的。如果它在那里,它只会覆盖它。

虽然这不是一个大问题,但它有些问题,因为它会更改文件的所有者,从而阻止下一个构建工作。

有没有其他人遇到过这个问题?安装程序是否有一些选项可以不覆盖已安装应用程序的每个副本?

4

2 回答 2

1

安装程序有一些功能可以定位已在文件系统中移动的应用程序包。在已编译的 .pkg 中,查看PackageInfoDistribution文件,看看是否看到任何<locator>标签。该<locator>标签在下面的链接中定义,是启用此类功能的主要方法之一。

https://developer.apple.com/library/archive/documentation/DeveloperTools/Reference/DistributionDefinitionRef/Chapters/Distribution_XML_Ref.html#//apple_ref/doc/uid/TP40005370-CH100-SW15

另一种可能性是您可能有一个带有属性集的<bundle>元素,如此处所述:search

https://developer.apple.com/library/archive/documentation/DeveloperTools/Reference/DistributionDefinitionRef/Chapters/Distribution_XML_Ref.html#//apple_ref/doc/uid/TP40005370-CH100-SW36

如果您想轻松检查编译包的内部结构,可以使用Pacifist轻松完成。(免责声明:我是和平主义者的作者)

于 2018-07-12T15:35:10.743 回答
0

这只是一种预感,但我想知道是否可以通过删除安装收据来忘记应用程序的当前安装来解决这个问题:

  • sudo pkgutil --forget com.mycompany.myapp.pkg

您可以像这样获取机器上所有包裹收据的列表:

  • sudo pkgutil --pkgs

我有这种预感的原因是因为我认为安装位置可能存储在收据中。因此,导致机器“忘记”(删除)软件包所在的位置可能会导致安装程序必须安装在软件包指定的指定位置。我完全承认这是一个 WAG(疯狂的猜测)。

于 2018-07-12T15:14:56.160 回答