升级通过Homebrew Cask安装的所有酒桶


157

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


3
附加问题:“我将如何升级其中一个桶?”
马修·哈伍德

我对此非常感兴趣……似乎没有任何方法可以升级酒桶,但这没有任何意义。我已经安装了Brackets 1.3,并且已经在括号内安装了插件。现在1.4版已经发布了,我想升级,但是保留插件。我不知道该怎么做。
让·弗朗索瓦·Beauchef

具体而言,关于托架,OS X上用于托架的用户扩展存储在中~/Library/Application Support/Brackets/extensions/user,并且这些扩展应在整个升级过程中保持不变。系统插件确实存储在中的应用程序包中Brackets.app/extensions/default,当您替换应用程序包时,它们会丢失,但是最简单的方法就是将插件从旧的程序包复制到新的程序包中。
Caleb Xu

仅供参考:机具brew cask upgrade合并了15次提交到Homebrew:master
l --marc l

我发现升级一个木桶的唯一方法就是brew cask uninstall my-cool-cask那么brew cask install my-cool-cask
亚伦·格雷

Answers:


291

现在终于有了针对Homebrew Cask的官方升级机制(有关实施,请参阅问题3396)!要使用它,只需运行以下命令:

brew cask upgrade

但是,这不会更新没有版本信息的桶(version :latest)或具有内置升级机制的应用程序(auto_updates true)。要重新安装这些木桶(如果有可用的升级,则要对其进行升级),请运行带有以下--greedy标记的upgrade命令:

brew cask upgrade --greedy


3
感谢@mipadi将我下面的答案复制到了这个答案中,而没有引用或批评。无论如何,现在这似乎已经完成。
enrico.bacis

3
@ enrico.bacis:寒意。我没有看到您的答案,这是显而易见的补充。(根据记录,应该编辑该答案,而不是添加新答案。)
mipadi 2015年

2
这真的让我很生气,因此我创建了此脚本来更新所有Brew应用程序,并允许用户选择要更新的Cask应用程序。您也可以将应用排除在外。 github.com/derrekyoung/ScriptsAndUtils/blob/master/...
德瑞克

14
现在,您可以brew cask outdated | xargs brew cask reinstall用来仅重新安装陈旧的酒桶。
phdoerfler '17

2
重要的是要注意,brew cask outdated仅打印未启用“自动更新”的应用程序的名称。要升级所有过时的应用,请使用brew cask outdated --greedy --verbose | grep -v '(latest)' | awk '{print $1}' | xargs brew cask reinstall
jmk

48

自制酒桶升级

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

安装与使用

brew tap buo/cask-upgrade
brew update
brew cu

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

brew cu --all

@XingangHuang是的
ovnia

26

可以通过以下方式列出已安装的木桶:

brew cask list

并使用以下命令强制重新安装桶:

brew cask install --force CASK_NAME

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

brew cask list | xargs brew cask install --force

1
那实际上并没有更新木桶。即使没有可用更新的木桶,它也会强制重新安装。根据您安装的木桶数量以及安装时间,这可能会触发不必要的下载,花费大量时间并提示进行sudo访问。
Burhan Ali

20

Bash脚本升级软件包

灵感来自Pascal答案

#!/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 info $cask | grep "Not installed"吗?
2016年

@Det hah ...好吧,我没有看到它,但是我现在知道了。好吧,我可能会在下一个版本中做到这一点;-)
Atais

1
$ brew cask info $cask | grep "Not installed"给出错误Error: This command requires a Cask token
eduncan911 '16

1
@ eduncan911你的脚本中使用它,在后for cask in ${casks[@]}; do
挪威

smacks head明显!简直不敢相信我没有抓住。
eduncan911 '16

11

截至2017年12月使用: 酿造酒桶升级

[自2017年12月在Homebrew为酒桶引入升级命令以来不推荐 使用]我仅使用以下内容:

brew cask outdated | xargs brew cask reinstall


基本上,我也这样做,只是我一直awk '{print $1}'在两者之间进行交流。
Paul Nelson Baker

6

这是我编写的用于处理此问题的函数。请注意,我个人不希望它只是盲目地重新安装所有内容,因为我使用的某些酒桶需要一段时间才能安装或需要其他提示。

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 
} 

我正在运行OS X El Capitan,但是在测试此功能时,我的shell抛出了错误,因为-在函数名称中不允许使用-字符。重要区别-尽管它在bash中有效,但sh不允许使用它,因此,如果您使用#!/ bin / sh来确保具有多个shell的系统之间的兼容性,则此方法将无效。但是,将连字符更改为下划线会很好。
Bryan'BJ'Hoffpauir Jr.

5

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

如果您~/bin的路径中没有,请~/bin/在上述语句之前添加前缀。


5

brew cask upgrade

upgrade命令最近在Homebrew Cask中引入,应该弃用其他答案中描述的所有其他手动方法。


尽管此命令存在,但实际上并不会升级许多软件包。
Acumenus

4

我认为使用

brew cask reinstall `brew cask outdated`

会成功的 这也将有助于删除该应用程序的先前版本,并将安装较新的版本。


2
现在应该是brew cask reinstall `brew cask outdated`
gbonetti

1
感谢更新@gbonetti。你是对的。使用新的“过时”选项,任务也变得越来越容易:-)。
普拉纳布·阿加瓦尔

2

改进了deinspanjer提供的代码我试图模仿noop命令,就像Chocolatey中的命令一样(choco update --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

可以看到,由于用例略有不同,因此我正在使用模块化方法。我不想坐在电脑前,对我安装的每个应用程序都键入“是/否”。虽然没有升级木桶的真正方法(只需重新安装最新版本),但我首先进行brew更新,以获取实际上有可用更新的信息

接下来,我循环浏览所有酒桶以显示其信息。因为我之前做过brew更新,所以现在提供的信息是未安装某些cask的最新版本。

在更新方法内部,我实际上解析了该特定行的info命令:

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

意思是:“只要您阅读“未安装”行,就在信息的上方提供三行。然后删除其中包含链接的任何行,同时删除其中包含“:”的行。

给定brew cask info命令的结构,我们最后得到一行(无版本信息,无应用程序URL),该行反映了也安装了该桶的实际名称。

酿造桶信息输出

在我的版本中,此信息现在已打印出来,因此您可以轻松查看哪些酒桶已过期并且可以更新。

在这一点上,我做了一个切换案例,因为现在可能没有足够的时间来更新内容。这取决于您的用例。对我来说,有时我只想看看有什么新功能(正在等待新版本,错误修正),但实际上没有时间更新内容,因为现在我不想关闭浏览器等。

因此,如果选择“是”,则将已清理的木桶名称列表提供给更新功能,其中对于每个确定为过时的木桶,将发出重新安装。

再次感谢deinspanjer,在尝试自己解决该问题时,我总是忘记事先发布brew更新,因此那里没有要实际解析的“未安装”行(我整个方法的基础)。

我希望这可以帮到你。




2

取得陈旧的木桶:

酿造桶已经过时

升级酒桶:

酿造桶重新安装陈旧的桶

演示脚本:

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

1

基于我所阅读的内容,我创建了一个脚本,该脚本将创建一个文件,该文件列出了要更新的文件,包括定义为最新的应用程序。然后,您可以使用我的olinst脚本修改文件以满足您的要求并安装更新。

有关更多信息,请访问我的github。

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



1

我用

brew cask install --force `brew cask list`

1

检查陈旧的酒桶:

酿造桶已经过时

升级所有过时的酒桶:

酿造桶升级

如果要升级特定的酒桶,只需在升级后添加酒桶名称(例如:4k-video-downloader):

酿造桶升级4k视频下载器


2
嗨,欢迎来到StackOverflow。鉴于这是一个有多个答案的老问题,其中一个非常受欢迎且已被接受,请编辑您的答案以详细说明它如何回答该问题以及为什么它比现有答案更可取。谢谢。
MandyShaw
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.