我有一个Homebrew公式,我希望卸载/删除及其所有依赖项,跳过其他包所依赖的包(在包管理器中称为级联包删除)。
例如,卸载依赖于包b和c的包a,其中包d也依赖于包c。结果应该卸载a和b,跳过c。
我该怎么做呢?
必须有一种方法来卸载一个包而不留下不必要的垃圾。
我有一个Homebrew公式,我希望卸载/删除及其所有依赖项,跳过其他包所依赖的包(在包管理器中称为级联包删除)。
例如,卸载依赖于包b和c的包a,其中包d也依赖于包c。结果应该卸载a和b,跳过c。
我该怎么做呢?
必须有一种方法来卸载一个包而不留下不必要的垃圾。
当前回答
使用这个答案需要创建并维护一个文件,其中包含希望安装在系统上的包名。如果您还没有安装包,请使用以下命令并删除您不想保留安装的包名。
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。
其他回答
到2020年底,Homebrew团队添加了一个简单的命令酿造自动删除功能,以删除所有未使用的依赖项。
首先,卸载包:
酿造卸载<包>
然后,删除所有未使用的依赖项:
酿造autoremove
使用这个答案需要创建并维护一个文件,其中包含希望安装在系统上的包名。如果您还没有安装包,请使用以下命令并删除您不想保留安装的包名。
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。
稍微精致;可提供多个包装;没有供应时有使用。
#!/bin/bash
# Removes the package and all dependancies.
if [ $# -eq 0 ]; then
echo "$(basename $0) <pkg> [<pkg> [...]]"
exit 1
fi
function tree() {
pkg="$1"
join <(brew leaves) <(sort <(brew deps ${pkg}; echo ${pkg}))
}
let e=0
for pkg in "$@"; do
printf "Purging %s and its dependencies...\n" "${pkg}"
deps=( $(tree ${pkg}) )
while (( ${#deps[@]} > 0 )); do
brew rm "${deps[@]}"
deps=( $(tree ${pkg}) )
done
done
这里的目标是删除给定的包及其依赖关系,而不破坏另一个包的依赖关系。我使用这个命令:
brew deps [FORMULA] | xargs brew remove --ignore-dependencies && brew missing | xargs brew install
注:经过编辑以反映@alphadogg的有用评论。
为此,您可以使用UNIX管道
brew deps [FORMULA] | xargs brew rm