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

时间:2018-07-12 06:28:20

标签: macos pkgbuild productbuild

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

我的安装程序版本如下:

const testTrue = sample.map((condition) => {
  return someFunc(condition.abc, value)
});

现在,它可以工作了……它可以按照我的期望将应用程序安装在/ Applications文件夹中。但是我注意到我的下一个Xcode构建存在一些问题。经过一番调查之后,我注意到在Xcode构建之后和运行安装程序之前,我的构建文件夹如下所示:

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"

…这样运行安装程序后:

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

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

虽然这不是一个大问题,但由于它更改了文件的所有者,从而阻止了下一个版本的工作,因此在某种程度上存在问题。

还有其他人遇到此问题吗?安装程序有一些选项可以不覆盖已安装应用程序的每个副本吗?

2 个答案:

答案 0 :(得分: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来轻松地完成此操作。 (免责声明:我是《和平主义者》的作者)

答案 1 :(得分:0)

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

  • sudo pkgutil-忘记com.mycompany.myapp.pkg

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

  • sudo pkgutil --pkgs

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