【问题标题】:Upgrade all the casks installed via Homebrew Cask升级通过 Homebrew Cask 安装的所有木桶
【发布时间】:2015-11-05 06:23:14
【问题描述】:

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

【问题讨论】:

  • 附加问题:“我将如何升级其中一个木桶?”
  • 我会对此非常感兴趣...似乎没有任何方法可以升级木桶,但这没有意义。我安装了 Brackets 1.3,并且在括号内安装了插件。现在 1.4 出来了,我想升级,但保留插件。我不明白我应该怎么做。
  • 关于括号,OS X 上括号的用户扩展存储在~/Library/Application Support/Brackets/extensions/user,这些应该在升级过程中保持不变。系统插件确实存储在 Brackets.app/extensions/default 的 app bundle 中,当您更换 app bundle 时这些插件会丢失,但最简单的方法是将插件从旧 bundle 复制到新 bundle。
  • 仅供参考:Implement brew cask upgrade 将 15 个提交合并到 Homebrew:master
  • 我发现升级单个木桶的唯一方法是先升级到brew cask uninstall my-cool-cask,然后升级到brew cask install my-cool-cask

标签: macos homebrew homebrew-cask


【解决方案1】:

Homebrew Cask 现在终于有了官方升级机制(具体实现见Issue 3396)!要使用它,只需运行以下命令:

brew upgrade --cask

但是,这不会更新没有版本信息 (version :latest) 的 casks 或具有内置升级机制 (auto_updates true) 的应用程序。要重新安装这些木桶(并在升级可用时升级它们),运行带有 --greedy 标志的升级命令,如下所示:

brew upgrade --cask --greedy

【讨论】:

  • 谢谢,但答案是专门针对所有酒桶。我会尽力回答。
  • @enrico.bacis:冷静。我没有看到你的答案,这是一个明显的补充。 (为了记录,应该编辑这个答案而不是添加一个新答案。)
  • 这真的让我很恼火,所以我创建了这个脚本来更新所有 Brew 应用程序并允许用户选择要更新的 Cask 应用程序。您也可以将应用排除在考虑之外。 github.com/derrekyoung/ScriptsAndUtils/blob/master/…
  • 您现在可以使用brew cask outdated | xargs brew cask reinstall 仅重新安装过时的木桶。
  • 需要注意的是,brew cask outdated 只打印出未启用“自动更新”的应用程序的名称。要升级所有过时的应用程序,请使用brew cask outdated --greedy --verbose | grep -v '(latest)' | awk '{print $1}' | xargs brew cask reinstall
【解决方案2】:

自制桶升级

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

安装和使用

brew tap buo/cask-upgrade
brew update
brew cu

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

brew cu --all

【讨论】:

  • @XingangHuang 是的
【解决方案3】:

可以列出已安装的木桶:

brew cask list

并强制重新安装木桶:

brew cask install --force CASK_NAME

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

brew cask list | xargs brew cask install --force

【讨论】:

  • 这并没有真正更新木桶。它会强制重新安装,即使对于没有可用更新的木桶也是如此。根据您安装的木桶数量和安装时间,这可能会触发不必要的下载、花费大量时间并提示 sudo 访问。
【解决方案4】:

升级包的 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 cask,清理
  • 阅读木桶清单
  • 查看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"吗?
  • @Det hah...好吧,我没看到,但我现在看到了。好吧,我可能会在下一个版本中这样做;-)
  • $ brew cask info $cask | grep "Not installed" 给出错误Error: This command requires a Cask token
  • @eduncan911 你在脚本中使用它,在for cask in ${casks[@]}; do之后
  • smacks head 显然!不敢相信我没听懂。
【解决方案5】:

brew cask upgrade

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

【讨论】:

    【解决方案6】:

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

    [自 2017 年 12 月 Homebrew 为 cask 引入升级命令后已弃用] 我只是使用以下内容:

    brew cask outdated | xargs brew cask reinstall
    

    【讨论】:

    • 基本上我也是这样做的,除了我一直在两者之间使用awk '{print $1}'
    【解决方案7】:

    这是我为处理此问题而编写的函数。请注意,我个人不希望它只是盲目地重新安装所有东西,因为我使用的一些木桶需要一段时间才能安装或需要额外的提示。

    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 抛出了错误 because the - is not an allowed character in function names。重要的区别 - 虽然它在 bash 中工作,但它不允许用于 sh 所以如果你使用 #!/bin/sh 来实现跨具有多个 shell 的系统的兼容性,这将不起作用。不过,将连字符改为下划线效果很好。
    【解决方案8】:

    根据@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;因此,您可以将其快速安装到您的~/binwith:

    $ 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】:

      我认为使用

      brew cask reinstall `brew cask outdated`
      

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

      【讨论】:

      • 现在应该是brew cask reinstall `brew cask outdated`
      • 感谢@gbonetti 的更新。你是对的。使用新的“过时”选项,任务也变得更容易和更快:-)。
      【解决方案10】:

      带有“auto_updates”或“version :latest”的木桶将不会升级;通过--greedy 升级它们:

      brew upgrade --cask --greedy
      

      【讨论】:

      • 这个应该是正确答案
      【解决方案11】:
      brew list --cask | xargs brew upgrade
      

      这会循环通过 brew cask 安装的所有应用程序并一次升级它们。

      brew upgrade --cask
      

      不再适合我。

      【讨论】:

        【解决方案12】:

        改进了 deinspanjer 提供的代码,我尝试模仿一个 noop 命令,就像来自 Chocolatey 的那个(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
        

        正如大家所见,我使用的是模块化方法,因为我的用例略有不同。我不想坐在我的电脑前为我安装的每个应用程序输入是/否。虽然没有真正的升级木桶的方法(只是重新安装最新版本),但我首先进行 brew update 以获得实际可用更新的信息

        接下来,我循环浏览所有酒桶以显示它们的信息。因为我之前做过brew update,所以现在提供了一些cask的最新版本没有安装的信息。

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

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

        这意味着:“在您阅读“未安装”行时提供上述 3 行信息。然后删除其中包含链接的任何行,同时删除其中包含“:”的行。 "

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

        brew cask info output

        在我的版本中,此信息现在已打印出来,因此人们可以轻松查看哪些木桶已过时并可以更新。

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

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

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

        我希望这会有所帮助。

        【讨论】:

          【解决方案13】:

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

          【讨论】:

            【解决方案14】:
            brew cask outdated | xargs brew cask reinstall --force
            

            【讨论】:

              【解决方案15】:

              获取过时的木桶:

              酿造桶过时

              升级木桶:

              brew cask reinstall 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}"
              

              【讨论】:

                【解决方案16】:

                检查过时的酒桶:

                酿造桶过时

                升级所有过时的木桶:

                酿造桶升级

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

                brew cask 升级 4k-video-downloader

                【讨论】:

                • 嗨,欢迎来到 StackOverflow。鉴于这是一个有多个答案的老问题,其中一个非常受欢迎和被接受,请编辑您的答案以提供更多详细信息,说明它如何回答问题以及为什么它比现有答案更可取。谢谢。
                【解决方案17】:
                brew cask upgrade $(brew list --cask)
                

                【讨论】:

                • 自 2021 年起,brew cask 已从 brews 命令集中移除。看起来@Golamrabbi Azad 的答案是当前的相关选项。
                【解决方案18】:

                brew upgrade --cask $(brew list --cask)

                【讨论】:

                • 这对我有用!
                【解决方案19】:

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

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

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

                【讨论】:

                  【解决方案20】:

                  这真的让我很恼火,所以我创建了这个脚本来更新所有 Brew 应用程序并允许用户选择要更新的 Cask 应用程序。您也可以将应用排除在考虑之外。

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

                  【讨论】:

                    【解决方案21】:

                    我用

                    brew cask install --force `brew cask list`
                    

                    【讨论】:

                      【解决方案22】:

                      我使用鱼壳。 所以我使用:brew upgrade (brew list --cask)。 它对我有用。

                      【讨论】:

                        猜你喜欢
                        • 2020-02-08
                        • 1970-01-01
                        • 2016-01-10
                        • 2019-04-14
                        • 2022-06-30
                        • 2014-06-22
                        • 1970-01-01
                        • 2023-03-15
                        • 2015-02-07
                        相关资源
                        最近更新 更多