Mac 安装程序覆盖文件的所有副本

Mac installer overwrites ALL copies of file

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

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

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

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

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

还有其他人运行关注这个问题吗?安装程序是否有一些选项不覆盖已安装应用程序的每个副本?

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

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

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

  • sudo pkgutil --pkgs

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

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

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

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

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

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