21

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

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

另外我想知道是否也删除包的痕迹使用是一种好习惯pkgutil --forget- 如果我不这样做,下次安装包时它会显示为升级而不是安装。对最佳实践信息有任何建议或指示吗?

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

4

5 回答 5

17

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

是的,您应该包括pkgutil --forget.

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

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

顺便说一句,如果你去寻找软件交付指南,它已经被移动了一年左右,而他们“更新”了它。

于 2011-09-09T00:25:31.583 回答
7

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

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

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

于 2013-07-02T12:33:36.017 回答
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
于 2012-05-24T12:36:08.940 回答
4

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

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

于 2011-11-02T17:26:04.180 回答
1

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

 brew cask uninstall --force <pkg_name>

前任。brew cask卸载--force dockertools

于 2016-02-18T21:02:47.027 回答