升级所有通过自制酒桶安装的木桶

我使用Homebrew Cask在OS X上安装应用程序。如何升级所有安装的木桶?

没有官方的升级自制酒桶的方法。 目前这个工作正在进行中,但还没有完成。 有关更多详细信息,请参阅问题#4678 。 这个问题也有一些用户升级所有木桶的脚本的例子。 升级一个木桶的最简单的方法是运行brew cask install --force <cask_name> ,但只是知道这可能会导致您的应用程序出现问题,因为它不会被正确地卸载。 通常这不是一个问题。

您可以使用以下shell命令升级所有安装的木桶:

 brew cask list | xargs brew cask install --force 

为了将来的参考,更多的细节可以在github的重复问题中find。

2017年3月更新(介意双关语;)

我发现一些更新,因为这是最初的答案。 对于解决方法,您现在可以使用brew cask reinstall

 brew cask reinstall <cask_name> brew cask list | xargs brew cask reinstall 

在原来的答案中提到的问题4678已经closures,升级function现在在问题#29301中讨论。还有buo / homebrew- cask -upgrade ,这是一个外部程序包,用于添加升级命令到brew木桶。 我已经testing了一些包上成功

自制-木桶升级

我认为这是迄今为止升级木桶的最佳解决scheme。
来源: https //github.com/buo/homebrew-cask-upgrade

安装和使用

 brew tap buo/cask-upgrade brew update brew cu 

(可选)强制升级过时的应用程序,包括标记为最新的应用程序:

 brew cu --all 

可以列出已安装的木桶:

 brew cask list 

并强制重新安装一个木桶:

 brew cask install --force CASK_NAME 

因此,将第一个命令的输出传送到第二个命令,我们更新所有的桶:

 brew cask list | xargs brew cask install --force 

Bash脚本来升级包

受帕斯卡答复启发

 #!/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

我简单地使用以下内容:

 brew cask outdated | xargs brew cask reinstall 

这是我写的处理这个的函数。 请注意,我个人不希望它只是盲目地重新安装一切,因为我使用的一些桶需要一段时间来安装或需要额外的提示。

 brew-cask-upgrade() { if [ "$1" != '--continue' ]; then echo "Removing brew cache" rm -rf "$(brew --cache)" echo "Running brew update" brew update fi for c in $(brew cask list); do echo -e "\n\nInstalled versions of $c: " ls /opt/homebrew-cask/Caskroom/$c echo "Cask info for $c" brew cask info $c select ynx in "Yes" "No" "Exit"; do case $ynx in "Yes") echo "Uninstalling $c"; brew cask uninstall --force "$c"; echo "Re-installing $c"; brew cask install "$c"; break;; "No") echo "Skipping $c"; break;; "Exit") echo "Exiting brew-cask-upgrade"; return;; esac done done } 

我想用

 brew cask reinstall `brew cask outdated` 

会做的伎俩。 这也将有助于删除以前版本的应用程序,并将安装较新的版本。

基于@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 

只要安装它(又名“我现在需要它!”)

这是检查到我的.dotfiles回购 ; 所以,你可以快速安装到你的~/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 

如果你的path里没有~/bin~/bin/前面加上前面的语句。

deinspanjer提供的代码改进,我试图模仿noop命令,就像从巧克力( choco更新–noop / choco过时 )。

https://git.io/vgjiL

 #!/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 

可以看到,我使用的是模块化方法,因为我的用例有所不同。 我不想坐在电脑前,为我安装的每个应用程序inputyes / no。 虽然没有真正的升级木桶的方法(只是重新安装最新的版本),我首先要做的是更新,以获得有实际更新的信息

接下来,我循环所有的桶来显示他们的信息。 因为我之前做过更新,现在提供一些木桶最新版本没有安装的信息。

在我的更新方法中,我实际上parsing了特定行的info命令:

 lookup | grep -B 3 'Not installed' | sed -e '/^http/d;/^Not/d;/:/!d' | cut -d ":" -f1 

这意味着:“当你阅读”未安装“行时,给出上面提供的3行信息,然后删除其中有链接的行,也删除其中包含”:“的行。

鉴于brew cask info命令的结构,我们最后得到一行(没有版本信息,没有应用程序的URL),它反映了它也被安装的木桶的实际名称。

酿造木桶信息输出

在我的版本中,这个信息现在被打印出来,所以人们可以很容易地看到什么桶已经过时,可以更新。

在这一点上,我做了一个switch case,因为现在可能没有足够的时间去更新。 这取决于你的使用情况。 对我而言,我有时只是想看看有什么新东西(等待一个新版本,修正了一个bug),但是实际上没有时间去更新,因为现在我不想closures浏览器等等。

因此,如果select“是”,桶的已清理名称列表被赋予更新function,其中对于每个被确定为已经过期重新安装的桶。

再次感谢deinspanjer,在尝试为自己解决这个问题的时候,我总是忘记事先发布brew更新,所以没有“未安装”的行来实际parsing(我的整个方法的基础)。

我希望这可以帮到你。

我自己做了这样的脚本。 请看看github https://github.com/pesh1983/brew_cask_upgrade 。 它有很好的描述,但如果你有任何其他问题,请随时问我。 它确实是公平的升级:卸载和安装,所以任何必要的清理将由“brew”自己执行。

基于我已阅读我已经创build了一个脚本,将创build一个文件,列出要更新的文件,包括定义为最新的应用程序。 然后,您可以修改文件以符合您的要求,并使用我的olinst脚本安装更新。

欲了解更多信息,请访问我的github。

https://github.com/pacav69/caskroom-offline-install

这真让我厌恶,所以我创build了这个脚本来更新所有的Brew应用程序,并允许用户select更新的Cask应用程序。 您也可以将应用排除在外。

https://github.com/derrekyoung/ScriptsAndUtils/blob/master/brew-cask-upgrade.sh

我用

 brew cask install --force `brew cask list` 
 brew cask outdated | xargs brew cask reinstall --force 

过时的桶:

酿造木桶过时了

升级木桶:

酿造酒桶重新安装过时的酒桶

演示脚本:

 $ 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}"