我使用Homebrew Cask在OS X上安装应用程序。如何升级所有已安装的存储桶?
答案 0 :(得分:221)
2017年12月更新
我认为它永远不会发生,但现在终于有一个Homebrew Cask的官方升级机制(参见Issue 3396的实现)!要使用它,只需运行以下命令:
brew cask upgrade
但是,这不会更新没有版本控制信息的存储区(version :latest
)或具有内置升级机制的应用程序(auto_updates true
)。要重新安装这些磁盘(并在升级可用时升级它们),请运行带有--greedy
标志的upgrade命令,如下所示:
brew cask upgrade --greedy
2017年3月更新(介意双关语;)(@ polo)
我发现了一些更新,因为这是最初的答案。
要解决此问题,您现在可以使用brew cask reinstall
:
brew cask reinstall <cask_name>
brew cask list | xargs brew cask reinstall
原始答案中提到的问题4678已关闭,现在在Issue #29301中讨论了升级功能 还有buo/homebrew-cask-upgrade,一个外部包,可以将brew命令添加到brew桶中。我已经成功地在几个包上测试了它。
原始答案
没有官方方法可以升级自制垃圾桶。目前正在开展这项工作,但距离完成还有很长的路要走。有关详细信息,请参阅Issue #4678。该问题还有一些用户用来升级所有漏洞的脚本示例。升级单个桶的最简单方法是运行brew cask install --force <cask_name>
,但只知道这可能会导致您的应用出现问题,因为它无法首先正确卸载。通常这不是问题。
您可以使用以下shell命令升级所有已安装的存储桶:
brew cask list | xargs brew cask install --force
为了将来参考,可以在duplicate issue on github中找到更多详细信息。
答案 1 :(得分:42)
我认为这是升级垃圾桶的最佳解决方案。
来源: https://github.com/buo/homebrew-cask-upgrade
安装&amp;使用强>
brew tap buo/cask-upgrade
brew update
brew cu
(可选)强制升级过时的应用程序,包括标记为最新的应用程序:
brew cu --all
答案 2 :(得分:26)
可以列出已安装的桶:
brew cask list
并强制重新安装一个木桶:
brew cask install --force CASK_NAME
所以将第一个命令的输出传递到第二个命令,我们更新所有的桶:
brew cask list | xargs brew cask install --force
答案 3 :(得分:19)
#!/usr/bin/env bash
(set -x; brew update;)
(set -x; brew cleanup;)
(set -x; brew cask cleanup;)
red=`tput setaf 1`
green=`tput setaf 2`
reset=`tput sgr0`
casks=( $(brew cask list) )
for cask in ${casks[@]}
do
version=$(brew cask info $cask | sed -n "s/$cask:\ \(.*\)/\1/p")
installed=$(find "/usr/local/Caskroom/$cask" -type d -maxdepth 1 -maxdepth 1 -name "$version")
if [[ -z $installed ]]; then
echo "${red}${cask}${reset} requires ${red}update${reset}."
(set -x; brew cask uninstall $cask --force;)
(set -x; brew cask install $cask --force;)
else
echo "${red}${cask}${reset} is ${green}up-to-date${reset}."
fi
done
它的作用
brew cask info
是否有最新版本来源: https://gist.github.com/atais/9c72e469b1cbec35c7c430ce03de2a6b
一个不耐烦的班轮:
curl -s https://gist.githubusercontent.com/atais/9c72e469b1cbec35c7c430ce03de2a6b/raw/36808a0544628398f26b48f7a3c7b309872ca2c6/cask_upgrade.sh | bash /dev/stdin
另存为 /usr/local/bin/cask-upgrade
,因此您可以在cask-upgrade
之后在本地运行
答案 4 :(得分:11)
截至2017年12月使用: brew cask升级
[自2017年12月以来,Homebrew推出了针对cask的升级命令时已弃用]
我只是使用以下内容:
brew cask outdated | xargs brew cask reinstall
答案 5 :(得分:6)
以下是我为处理此问题而编写的功能。请注意,我个人并不希望它只是盲目地重新安装所有内容,因为我使用的一些桶需要一段时间才能安装或需要额外的提示。
$("#close").click(function(){
window.close();
});
答案 6 :(得分:5)
brew cask upgrade
最近在Homebrew Cask中引入了upgrade
命令,并且应该弃用其他答案中描述的所有其他手动方法。
答案 7 :(得分:4)
我认为使用
brew cask reinstall `brew cask outdated`
会做到这一点。这也有助于删除应用程序的先前版本,并将安装较新版本。
答案 8 :(得分:4)
基于@Atais的回答,我将他的逻辑提升为更好的东西。在实际强制升级之前,我想要一种方法来检查要升级的软件包。
$ brew-cask.sh
只列出类似于Homebrew的brew update
。✔
表示正在等待更新。$ brew-cask.sh upgrade
将强制升级这些软件包。代码:
# Usage:
#
# $ brew update
# You should execute this first to update everything locally.
#
# $ brew-cask.sh [update]
# This will list all of your cask packages and rather there is an upgrade
# pending with a ✔ checkmark, just like Homebrew does with "brew update".
# The update command is optional, as it doesn't actually do any tracking, there's
# not really anything to "update" with cask. But it keeps with the pattern of
# of Homebrew's "brew update" pattern for those with memory muscle fingers (like me).
#
# $ brew-cask.sh upgrade
# This performs a "brew cask install <cask> --force" of all cask packages that have
# an update pending.
#
# This code was inspired by http://stackoverflow.com/a/36000907/56693
# get the list of installed casks
casks=( $(brew cask list) )
if [[ "$1" == "upgrade" ]]; then
for cask in ${casks[@]}; do
current="$(brew cask info $cask | sed -n '1p' | sed -n 's/^.*: \(.*\)$/\1/p')"
installed=( $(ls /opt/homebrew-cask/Caskroom/$cask))
if (! [[ " ${installed[@]} " == *" $current "* ]]); then
echo "Upgrading $cask to v$current."
(set -x; brew cask install $cask --force;)
else
echo "$cask v$current is up-to-date, skipping."
fi
done
else
echo "Inspecting ${#casks[@]} casks. Use 'brew-cask.sh upgrade' to perform any updates."
for (( i = i ; i < ${#casks[@]} ; i++ )); do
current="$(brew cask info ${casks[$i]} | sed -n '1p' | sed -n 's/^.*: \(.*\)$/\1/p')"
installed=( $(ls /opt/homebrew-cask/Caskroom/${casks[$i]}))
if (! [[ " ${installed[@]} " == *" $current "* ]]); then
casks[$i]="${casks[$i]}$(tput sgr0)$(tput setaf 2) ✔$(tput sgr0)"
fi
done
echo " ${casks[@]/%/$'\n'}" | column
fi
已检入my .dotfiles
repo;因此,您可以使用
~/bin
$ curl -L https://raw.githubusercontent.com/eduncan911/dotfiles/master/bin/brew-cask.sh --create-dirs -o ~/bin/brew-cask.sh
$ chmod 755 ~/bin/brew-cask.sh
然后像这样使用它:
$ brew-cask.sh
$ brew-cask.sh upgrade
如果您的路径中没有~/bin
,请在~/bin/
前加上上述语句。
答案 9 :(得分:2)
答案 10 :(得分:2)
过时的桶:
brew cask outdated
升级cask:
brew cask重新安装outdated-cask
演示脚本:
$ cat ~/bin/brew_cask_upgrade.sh
#!/bin/bash
red=$(tput setaf 1)
# green=$(tput setaf 2)
reset=$(tput sgr0)
(set -x; brew update;)
for cask in $(brew cask outdated | awk '{print $1}')
do
echo "${red}update ${cask} ...${reset}."
(set -x; brew cask install --force "$cask";)
done
echo "${red}brew clean up ...${reset}"
(set -x; brew cask cleanup;)
echo "${red}brew clean up done.${reset}"
答案 11 :(得分:2)
brew cask outdated | xargs brew cask reinstall --force
答案 12 :(得分:2)
改进了 deinspanjer提供的代码,我试图模仿noop命令,就像巧克力( choco update --noop / choco outdated )中的命令一样。
#!/bin/sh
fetch(){
echo "Removing brew cache"
rm -rf "$(brew --cache)"
echo "Running brew update"
brew update
}
lookup() {
for c in $(brew cask list); do
brew cask info $c
done
}
update(){
var=$( lookup | grep -B 3 'Not installed' | sed -e '/^http/d;/^Not/d;/:/!d' | cut -d ":" -f1)
if [ -n "$var" ]; then
echo "The following installed casks have updates avilable:"
echo "$var"
echo "Install updates now?"
select yn in "Yes" "No"; do
case $yn in
"Yes") echo "updating outdated casks"; break;;
"No") echo "brew cask upgrade cancelled" ;return;;
*) echo "Please choose 1 or 2";;
esac
done
for i in $var; do
echo "Uninstalling $c"; brew cask uninstall --force "$i"; echo "Re-installing $i"; brew cask install "$i"
done
else
echo "all casks are up to date"
fi
}
fetch
update
有人可以看到,我使用的是模块化方法,因为我的用例略有不同。我不想坐在我的电脑前,为我安装的每个应用输入yes / no。虽然没有真正的升级桶的方法(只是重新安装最新版本),但我首先进行brew更新以获得实际可用更新的信息。
接下来,我循环遍历所有桶以显示其信息。因为我之前做过brew更新,现在提供的信息是没有安装某个cask的最新版本。
在我的更新方法中,我实际上解析了该特定行的info命令:
lookup | grep -B 3 'Not installed' | sed -e '/^http/d;/^Not/d;/:/!d' | cut -d ":" -f1
其转换为:&#34;每当您阅读&#34;未安装&#34;时,请提供3行以上的信息。然后删除其中包含链接的任何行,同时删除包含&#39;:&#39;的行。在它。&#34;
鉴于brew cask info命令的结构,我们最终得到一行(没有版本信息,没有应用程序URL),这反映了它也随之安装的实际名称。
在我的版本中,此信息现已打印出来,因此您可以轻松查看哪些垃圾桶已过期且可以更新。
此时我做了一个切换案例,因为现在可能没有足够的时间来更新内容。这取决于你的用例。对我来说,我有时只想看看有什么新东西(等待新版本,修正错误),但实际上没有时间更新内容,因为我现在不想关闭浏览器等。
因此,如果选择&#34; yes&#34;,则清理的桶名称列表将被提供给更新功能,其中对于确定已过期的每个桶,将发布重新安装。
再次感谢deinspanjer,在尝试为自己解决这个问题时,我总是忘记事先发布brew更新,因此没有&#34;没有安装&#34;在那里实际解析(我的整个方法的基础)。
我希望这很有帮助。
答案 13 :(得分:1)
这真让我烦恼,所以我创建了这个脚本来更新所有Brew应用程序,并允许用户选择要更新的Cask应用程序。您也可以不考虑应用。
https://github.com/derrekyoung/ScriptsAndUtils/blob/master/brew-cask-upgrade.sh
答案 14 :(得分:1)
我用
annotations.*
答案 15 :(得分:1)
根据我所读到的内容,我创建了一个脚本,该脚本将创建一个文件,列出要更新的文件,包括定义为最新的应用程序。然后,您可以修改文件以满足您的要求,并使用我的olinst脚本安装更新。
有关更多信息,请访问我的github。
答案 16 :(得分:1)
我使用此命令
brew cask upgrade $(brew cask list)
效果很好!
答案 17 :(得分:1)
我使用鱼壳。
所以我使用:brew upgrade (brew list --cask)
。
它对我有用。
答案 18 :(得分:1)
brew upgrade --cask $(brew list --cask)
答案 19 :(得分:0)
检查陈旧的酒桶:
酒桶已经过时
升级所有过时的酒桶:
酒桶升级
如果要升级特定的酒桶,只需在升级后添加酒桶名称(例如:4k-video-downloader):
酒桶升级4k视频下载器
答案 20 :(得分:0)
带有“auto_updates”或“version :latest”的木桶将不会升级;通过 --greedy
升级它们:
brew upgrade --cask --greedy