作为我的用户的服务,我想提供一个卸载脚本来完全删除Mac OS X上我的应用程序的所有痕迹。应用程序是使用包安装而不是仅仅被拖入Applications文件夹,因为它是一个守护进程类型的应用程序,它还需要在安装时运行脚本才能启动。
我的想法是包含一个名为uninstall.sh
的文件并将其放入/Library/Application Support/com.<mycompany>.<myapplication>/
并从应用程序文档中引用它。目的基本上是在运行,卸载和删除相应的plist以及删除任何应用程序文件时停止守护程序。这听起来合理还是有更好的方法来实现这个目标?
另外,我想知道使用pkgutil --forget
删除包的痕迹是否也是一种好习惯 - 如果我不这样做,下次安装包时它会显示为升级而不是已安装。有关最佳实践信息的任何建议或指示吗?
在OS X上没有标准的方法吗?
答案 0 :(得分:17)
在OS X上没有标准的方法。是的,令人震惊,我知道。 Apple始终警告所有人远离软件包安装程序(除其他外,为他们提供的文档不足)。然后,他们专门为自己的独立应用程序使用软件包安装程序....图。
是的,您应该加入pkgutil --forget
。
如果您的客户对此类脚本感到满意,那么您的方法听起来不错。如果他们想要“双击它”,那么您应该将卸载程序放在/Applications
中,但如果可以,请避免使用。
如果您有GUI,状态项或首选项面板,那么最好在其中放置一个“卸载”按钮或菜单项,而不是要求它们使用终端。
顺便说一下,如果你去寻找软件交付指南,那么现在已经moved一年左右,而他们会“更新”它。答案 1 :(得分:6)
无法删除软件包多年来一直困扰着我,所以我写了一个卸载软件包的工具:
http://www.corecode.at/uninstallpkg/index.html
它比shell脚本好一点,因为它确保永远不会删除任何其他安装的软件包使用的任何文件
答案 2 :(得分:4)
我解决这个问题的方法是使用Automator,创建应用程序文档,然后添加对话框和脚本操作。最后保存Automator应用程序文档,最后得到一个简单的GUI应用程序来运行卸载。
卸载操作通常需要管理员权限 - 我通过运行shell脚本操作在Automator中解决了这个问题,该操作生成了另一个shell脚本,然后可以通过AppleScript操作运行,如下所示:
on run {input, parameters}
do shell script "/tmp/uninstaller.sh" with administrator privileges
return input
end run
答案 3 :(得分:3)
我有类似的应用程序并遇到了同样的问题。我采用的方法是我见过其他应用程序使用的方法。而不是简单地分发.pkg安装程序,将其包装在.dmg文件中。卸载脚本可以包含在.dmg中的.pkg中。
然后将卸载脚本重命名为“uninstall.tool”。 .tool扩展允许用户通过双击来运行脚本,而不必从命令行运行它。
答案 4 :(得分:1)
稍微不同寻常,但不是这些。我安装了Homebrew和cask。我能够使用以下内容卸载.pkg:
brew cask uninstall --force <pkg_name>
离。 brew cask uninstall --force dockertools