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

22
为了方便用户,我希望提供一个卸载脚本,以完全删除在Mac OS X上安装的应用程序的所有痕迹。该应用程序安装使用的是软件包而不是只是将其拖入"应用程序"文件夹,因为它是一种守护程序类型的应用程序,还需要在安装时运行脚本才能启动。
我的想法是包含一个名为"uninstall.sh"的文件,并将其放置在"/Library/Application Support/com.<mycompany>.<myapplication>/"中,并从应用程序文档中引用它。基本目的是停止守护程序(如果正在运行),卸载并删除相应的plist文件以及删除任何应用程序文件。这是否合理,或者有更好的方法可以实现这一点?
此外,我想知道是否有必要使用"pkgutil --forget"来删除软件包的痕迹。如果不这样做,则下次安装软件包时,它会显示为已升级而不是已安装。有什么建议或指向最佳实践信息的指针吗?
在OS X上没有标准的做法吗?

4
不应在文件夹名称中使用点,就像这样—— 如果您查看/Library/Application Support/文件夹,就会发现通常只需使用应用程序的名称作为该文件夹的名称。请注意,这是常规做法。 - Asmus
@Asmus:谢谢,我会改用 /Library/Application Support/<MyCompany>/<MyApplication>。 - villintehaspam
5个回答

17

在OS X上没有标准的方法来做到这一点。 是的,令人震惊,我知道。苹果公司持续警告大家远离软件包安装程序(除其他之外,还因为提供不充足的文档),然后他们专门使用软件包安装程序来制作独立应用...自相矛盾。

是的,你应该包括pkgutil --forget

如果您的客户对此类脚本感到满意,则您的方法听起来很好。 如果他们想要“双击它”,那么您可能应该将卸载程序放在/Applications中,但如果可以避免则应该避免。

如果您有GUI、状态栏或首选项面板,则最好在那里放置“卸载”按钮或菜单项,而不是要求他们去调整终端。

顺便说一下,如果您正在寻找软件交付指南,它已经被移动了一年左右,因为他们正在“更新”它。


7

多年来,无法删除软件包一直困扰着我,因此我编写了一个卸载软件包的工具:

http://www.corecode.io/uninstallpkg/

这比流传的shell脚本要好一些,因为它确保不会删除任何被其他已安装软件包使用的文件。

编辑:链接已修复。该应用程序自2021年10月起免费使用。


PKG卸载程序在我尝试从Logic Pro X的声音库中删除软件包时显示错误。它说无法删除软件包,因为存在系统完整性保护。 - rraallvv
@rraallvv:1.) stackoverflow不是随意应用程序的支持渠道,请直接与我们联系以获得您的反馈。2.) 自10.11版本起,SIP(系统完整性保护)会阻止任何应用程序修改系统文件...如果您想删除已安装到这些受保护位置的软件包,则必须禁用系统完整性保护(临时或永久)。 - user1259710
@user1259710,我不确定你的意思,但是我已经成功使用这个代码片段删除了软件包,而且没有禁用SIP。 - rraallvv
@rraallvv:你可以删除软件包本身,但是如果它们安装在像/System这样的SIP受保护文件夹中,则无法删除软件包已安装的任何文件....无论是使用UninstallPKG还是使用此(不安全的)gist都是不可能的。 - user1259710
固定链接:https://www.corecode.io/uninstallpkg/ - SardorbekR

5
我解决这个问题的方法是使用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

我有一个类似的应用程序,也遇到了同样的问题。我采取的方法是我看到其他应用程序使用的方法。不仅仅分发 .pkg 安装程序,而是将其包装在 .dmg 文件中。卸载脚本可以与 .pkg 一起包含在 .dmg 中。

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


1
稍微有些不寻常,但这些都是如此。我已经安装了Homebrew和cask。我能够使用以下命令卸载一个.pkg文件:
 brew cask uninstall --force <pkg_name>

例:brew cask uninstall --force dockertools

卸载dockertools的强制操作。


(1) 假设 dockertoolbox 是通过 Homebrew 和 cask 安装的。 (2) 这个问题是针对 Mac OS 应用程序的,不仅仅是 dockertoolbox。你的答案的有效性值得怀疑。 - rayryeng
令人惊讶的是,dockertoolbox是通过osx的安装程序从.pkg安装的,但是使用--force选项的brew cask可以卸载dockertoolbox。 - buildmaestro
很有趣,但是这个问题仍然适用于一般的OSX软件包。你的答案只针对特定的软件包。 - rayryeng
这适用于所有的osx软件包(正如问题所问)。我只能告诉你的是,在上面被接受的答案不起作用的情况下,这个方法有效。我可能会被投票否决,但我只是分享了我尝试过的每个osx软件包的解决方案。 - buildmaestro
我没有给你投反对票。那也很有趣。谢谢。为了平息负评,您可能需要重新措辞您的帖子,使其适用于任何通用的OSX软件包,而不是特定于dockertoolbox。 - rayryeng

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接