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

Macos Mac安装程序覆盖文件的所有副本,macos,pkgbuild,productbuild,Macos,Pkgbuild,Productbuild,我遇到了一个奇怪的问题,我的安装程序正确地覆盖了以前安装的应用程序,但随后覆盖了我构建目录中的应用程序 我的安装程序版本如下所示: 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/ \

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

我的安装程序版本如下所示:

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
…就像这样,在运行安装程序后:

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
在谷歌搜索之后,其他人猜测安装程序会覆盖它在硬盘上任何地方找到的应用程序的任何副本……而不仅仅是你告诉它的文件夹中的副本。这是有道理的…如果我在build文件夹中删除我的应用程序的副本,安装程序不会创建新的副本。它只会在它存在时覆盖它

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


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

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

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"
  • sudo pkgutil——忘记com.mycompany.myapp.pkg
您可以在计算机上获得所有包裹收据的列表,如下所示:

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"
  • sudo pkgutil--pkgs

我之所以有这种预感,是因为我认为安装位置可能存储在收据中。因此,导致计算机“忘记”(删除)软件包所在的位置可能会导致安装程序必须安装在软件包指定的位置。我完全承认这是一种胡思乱想。

安装程序有一些功能,可以定位文件系统中移动的应用程序包。在编译的.pkg中,查看
PackageInfo
发行版
文件,并查看是否看到任何
标记。
标记在下面的链接中定义,是启用此类功能的主要方式之一

另一种可能性是,您可能有一个
元素和
搜索
属性集,如下所述:


如果您想轻松地检查编译包的内部结构,可以使用来相当轻松地进行检查。(免责声明:我是《和平主义者》的作者)

事实证明,当我创建plist时,pkgbuild添加了一行。所以我刚刚添加了:plutil-replace bundleisrelocateble-bool NO MyApp.plist,它现在不会覆盖应用程序的其他副本。非常感谢。