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

时间:2015-08-12 14:51:29

标签: macos homebrew homebrew-cask

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

21 个答案:

答案 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)

用于升级软件包的Bash脚本

受到Pascal answer

的启发
#!/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 / brew桶,清理
  • 阅读垃圾桶列表
  • 检查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)

我自己制作了这样的剧本。请查看github https://github.com/pesh1983/brew_cask_upgrade。它有很好的描述,但如果您有任何其他问题,请随时问我。它进行公平升级:卸载和安装,因此任何必要的清理工作都将由'brew'本身执行。

答案 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 )中的命令一样。

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

有人可以看到,我使用的是模块化方法,因为我的用例略有不同。我不想坐在我的电脑前,为我安装的每个应用输入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),这反映了它也随之安装的实际名称。

brew cask info output

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

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

因此,如果选择&#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。

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

答案 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