Mac OS X 上的软件包卸载程序

Posted

技术标签:

【中文标题】Mac OS X 上的软件包卸载程序【英文标题】:Uninstaller for package on Mac OS X 【发布时间】:2011-07-15 19:57:57 【问题描述】:

作为对我的用户的一项服务,我想提供一个卸载脚本来完全删除我在 Mac OS X 上的应用程序的所有痕迹。该应用程序是使用一个包安装的,而不是仅仅被拖到 Applications 文件夹中,因为它是一个守护程序类型的应用程序,它还需要在安装时运行脚本才能启动。

我的想法是包含一个名为uninstall.sh 的文件并将其放入/Library/Application Support/com.<mycompany>.<myapplication>/ 并从应用程序文档中引用它。目的基本上是在运行时停止守护进程,卸载和删除相应的 plist 以及删除任何应用程序文件。这听起来合理还是有更好的方法来实现这一点?

我还想知道使用pkgutil --forget 删除包的痕迹是否是一种好习惯 - 如果我不这样做,下次安装包时它会显示为正在升级而不是安装。有没有关于最佳实践信息的建议或提示?

在 OS X 上没有标准的方法吗?

【问题讨论】:

您不应该在这样的文件夹名称中使用点 — 如果您查看您的 /Library/Application Support/ 文件夹,您会发现简单地使用您的应用程序名称是一种常见的做法为那个文件夹。 @Asmus:谢谢,我会改用 /Library/Application Support// 【参考方案1】:

在 OS X 上没有执行此操作的标准方法。是的,令人震惊,我知道。 Apple 一直警告所有人远离软件包安装程序(其中包括为他们提供的文档不足)。然后,他们专门为自己的独立应用程序使用包安装程序.... 去看看。

是的,您应该包含pkgutil --forget

如果您的客户对这种脚本感到满意,那么您的方法听起来不错。如果他们想要“双击它”,那么您可能应该将卸载程序放在/Applications,但如果可以的话,请避免这样做。

如果您有 GUI、状态项或首选项面板,那么最好在其中放置一个“卸载”按钮或菜单项,而不是要求它们与终端混在一起。

顺便说一句,如果您去寻找软件交付指南,moved 已经有一年左右的时间了,而他们正在“更新”它。

【讨论】:

【参考方案2】:

无法删除软件包的问题困扰了我多年,所以我编写了一个卸载软件包的工具:

http://www.corecode.at/uninstallpkg/index.html

它比 shell 脚本更好一点,因为它确保永远不会删除任何其他已安装包使用的文件

【讨论】:

PKG 卸载程序在我尝试从 Logic Pro X 的声音库中删除软件包时显示错误。它说由于系统完整性保护,它无法删除软件包。 @rraallvv: 1.) *** 不是随机应用程序的支持渠道,请直接与我们联系并提供您的反馈 2.) 因为 10.11 SIP(​​系统完整性保护)阻止任何应用程序修改系统文件.. . 如果您想删除已安装到这些受保护位置的软件包,您必须禁用系统完整性保护(临时或永久) @user1259710 我不确定你的意思,无论如何,我可以在不禁用 SIP 的情况下使用this gist 中的命令删除软件包。 @rraallvv:您可以删除软件包本身,但不能删除软件包已安装的任何文件,如果它们位于 /System 等受 SIP 保护的文件夹中......无论使用 UninstallPKG 还是使用它,这都是不可能的(不安全)要点【参考方案3】:

我有一个类似的应用程序并遇到了同样的问题。我采用的方法是我见过的其他应用程序使用的方法。与其简单地分发 .pkg 安装程序,不如将其包装在一个 .dmg 文件中。卸载脚本可以包含在 .dmg 中的 .pkg 中。

然后将卸载脚本重命名为“uninstall.tool”。 .tool 扩展名允许用户通过双击运行脚本,而不必从命令行运行。

【讨论】:

【参考方案4】:

我解决这个问题的方法是使用Automator,创建一个应用程序 文档,然后添加对话框和脚本操作。最后保存您的 Automator 应用程序文档,您将得到一个简单的 GUI 应用程序来运行卸载。

卸载操作通常需要管理员权限 - 我在 Automator 中通过运行一个 shell 脚本操作解决了这个问题,该操作生成另一个 shell 脚本,然后可以在 applescript 操作中运行,如下所示:

on run input, parameters
    do shell script "/tmp/uninstaller.sh" with administrator privileges
    return input
end run

【讨论】:

【参考方案5】:

有点不合常规,但还不是全部。我安装了 Homebrew 和木桶。我能够使用以下内容卸载 .pkg:

 brew cask uninstall --force <pkg_name>

例如。 brew cask uninstall --force dockertools

【讨论】:

(1) 这是假设 dockertoolbox 是通过 Homebrew 和木桶安装的。 (2) 这个问题是针对一般 Mac OS 应用程序的,而不仅仅是dockertoolbox。您的答案的有效性值得怀疑。 令人惊讶的是,dockertoolbox 是通过 osx 的安装程序从 .pkg 安装的,但带有 --force 选项的 brew cask 能够卸载 dockertoolbox。 这很有趣,但这个问题仍然适用于一般的 OSX 包。您的答案仅针对特定的包裹。 这适用于所有 osx 软件包(问题提出)。我只能告诉你的是,在上述接受的答案不起作用的地方,这个答案起作用了。我可能会被否决,但我只是分享我尝试过的每个 osx 包的工作原理。 我没有投票给你。这也很有趣。谢谢。为了安抚反对意见,您可能需要改写您的帖子,使其适用于任何通用 OSX 软件包,而不是专门针对 dockertoolbox。

以上是关于Mac OS X 上的软件包卸载程序的主要内容,如果未能解决你的问题,请参考以下文章

013_Mac OS X下应该如何卸载软件和安装应用软件

Mac上的软件清理卸载工具

如何从 Mac OS X 中卸载 MySQL?

如何卸载从 pkg (Mac OS X) 安装的 nodejs?

如何卸载从 pkg (Mac OS X) 安装的 nodejs?

如何从 Mac 卸载 Parallels Desktop 9