首页 文章

卸载/删除Homebrew包,包括其所有依赖项

提问于
浏览
270

我有一个Homebrew包,我希望卸载/删除所有依赖项,跳过其他包依赖的包 .

例如卸载包 a ,这取决于包 bc ,其中包 d 也取决于包 c . 结果应该同时卸载 ab ,跳过 c .

我怎样才能做到这一点?

必须有一种方法来卸载包,而不会留下不必要的垃圾 .

9 回答

  • 331

    其他答案对我不起作用,但这样做(在 fish shell中):

    brew remove <package>
    for p in (brew deps <package>)
        brew remove $p
    end
    

    因为 brew remove $p 在某些其他包依赖于 p 时失败 .

  • 0

    必须稍微修改@jfmercer的答案以使用当前brew,因为 brew missing 的输出已更改:

    brew deps [FORMULA] | xargs brew remove --ignore-dependencies && brew missing | cut -f1 -d: | xargs brew install
    
  • 9

    您可以使用UNIX管道

    brew deps [FORMULA] | xargs brew rm
    
  • 4

    这里的目标是删除给定的包及其依赖项 without 打破另一个包的依赖项 . 我用这个命令:

    brew deps [FORMULA] | xargs brew remove --ignore-dependencies && brew missing | xargs brew install
    

    注意:编辑以反映@ alphadogg的有用评论 .

  • 12

    编辑:

    它看起来像the issue is now solved using an external command called brew rmdeps or brew rmtree .

    要安装和使用,请发出以下命令:

    $ brew tap beeftornado/rmtree
    $ brew rmtree <package>
    

    有关更多信息和讨论,请参阅上面的链接 .


    原始答案:

    目前看来,没有简单的方法来实现这一目标 .

    但是,我filed an issue on Homebrew's GitHub page,有人建议临时解决方案,直到他们添加一个独占命令来解决这个问题 .

    有一个external command名为 brew leaves ,它打印所有不依赖于其他包的包 .

    如果在 brew leavesbrew deps <package> 的输出上执行逻辑 and ,您可能只会获得孤立依赖包的列表,之后可以手动卸载 . 将此与 xargs 相结合,你就可以依靠'll get what you need, I guess (untested, don'来计算 .


    EDIT: 有人提出了一个非常类似的解决方案,使用 join 而不是 xargs

    brew rm FORMULA
    brew rm $(join <(brew leaves) <(brew deps FORMULA))
    

    有关详细信息,请参阅comment on the issue mentioned above .

  • 0

    使用此答案要求您创建和维护包含要在系统上安装的软件包名称的文件 . 如果您还没有,请使用以下命令并删除您不想继续安装的软件包名称 .

    brew leaves > brew_packages
    

    然后,您可以通过运行以下命令删除所有已安装但不需要的软件包以及任何不必要的依赖项

    brew_clean brew_packages
    

    brew_clean 可在此处获取:https://gist.github.com/cskeeters/10ff1295bca93808213d

    此脚本获取您在brew_packages中指定的所有包及其所有依赖项,并将它们与 brew list 的输出进行比较,最后在与用户验证此列表后删除不需要的包 .

    此时,如果要删除包 a ,只需将其从brew_packages文件中删除,然后重新运行 brew_clean brew_packages . 它将删除 b ,但不会删除 c .

  • 11

    更完整的Bourne Shell函数

    已经有很多好的答案,但有些已经过时,而且没有一个完全完整 . 特别是,他们中的大多数将删除依赖关系,但仍然由您去除之后删除原始目标公式 . 如果要一次卸载多个公式,发布的单行也可能很难处理 .

    这是一个与Bourne兼容的shell函数(没有任何已知的Bashisms),它获取公式列表,删除每个公式的依赖项,删除公式本身的所有副本,然后重新安装任何缺少的依赖项 .

    unbrew () {
        local formula
        for formula in "$@"; do
            brew deps "$formula" |
            xargs brew uninstall --ignore-dependencies --force
            brew uninstall --force "$formula"
        done
        brew missing | cut -f2 -d: | sort -u | xargs brew install
    }
    

    它在Homebrew 1.7.4上进行了测试 .

    警告

    这适用于我测试的所有标准公式 . 它目前不处理桶,但如果你试图取出与标准配方同名的桶(例如MacVim),它也不会大声抱怨 .

  • 0

    基于@jfmercer的答案(更正需要的不仅仅是评论) .

    删除包的依赖项(不删除包):

    brew deps [FORMULA] | xargs brew remove --ignore-dependencies
    

    删除包:

    brew remove [FORMULA]
    

    重新安装缺少的库:

    brew missing | cut -d: -f2 | sort | uniq | xargs brew install
    

    发现MeldMerge releases后测试卸载 meld .

  • 24

    brew rmtree doesn't work at all . 从这个问题的链接我发现rmrec实际上工作 . 上帝知道为什么 brew 没有这个作为本地命令 .

    brew tap ggpeti/rmrec
    brew rmrec pkgname
    

相关问题