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

Upgrade all the casks installed via Homebrew Cask

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

终于有了 Homebrew Cask 的官方升级机制(参见 Issue 3396 实现)!要使用它,只需 运行 这个命令:

brew upgrade --cask

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

brew upgrade --cask --greedy

要过时:

brew outdated --cask --greedy --verbose

可以列出已安装的 casks:

brew cask list

并强制重新安装木桶:

brew cask install --force CASK_NAME

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

brew cask list | xargs brew cask install --force

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

brew_cask_upgrade() { 
  if [ "" != '--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 
} 

改进 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

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

接下来,我循环浏览所有木桶以显示它们的信息。因为之前刷过brew update,现在提示某个cask的最新版本没有安装

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

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

转换为:"Give the 3 lines above of info provided whenever you read the line "未安装”。然后删除其中包含 link 的任何行,同时删除其中包含“:”的行。“

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

brew cask info output

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

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

因此,如果选择 "yes",已清理的 casks 名称列表将提供给更新功能,其中对于确定为过时的每个 casks 都会发出重新安装。

再次感谢 deinspanjer,在尝试为自己解决这个问题时,我总是忘记事先发布 brew update,所以那里没有 "not installed" 行来实际解析(我整个方法的基础)。

希望对您有所帮助。

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:\ \(.*\)//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

根据@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 

# get the list of installed casks
casks=( $(brew cask list) )

if [[ "" == "upgrade" ]]; then
  for cask in ${casks[@]}; do
    current="$(brew cask info $cask | sed -n '1p' | sed -n 's/^.*: \(.*\)$//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/^.*: \(.*\)$//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

只需安装它(又名 "I need it now!")

签到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/

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

有关详细信息,请访问我的 github。

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

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

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

自制木桶升级

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

安装与使用

brew tap buo/cask-upgrade
brew update
brew cu

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

brew cu --all

我用

brew cask install --force `brew cask list`

我想用

brew cask reinstall `brew cask outdated`

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

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

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

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

brew cask outdated | xargs brew cask reinstall

获取过时的木桶:

brew cask outdated

升级桶:

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 }')
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}"
brew cask outdated | xargs brew cask reinstall --force

brew cask upgrade

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

检查过时的木桶:

brew cask outdated

正在升级所有过时的 cask:

brew cask upgrade

如果你想升级特定的 cask,只需在升级后添加 cask-name(例如:4k-video-downloader):

brew cask upgrade 4k-video-downloader

升级所有未标记为“auto-upgradable”的桶

brew upgrade --cask

升级所有桶(“auto-upgradable”而不是“auto-upgradable”)

brew upgrade --cask --greedy

我和鱼一起工作shell。 所以我使用:brew upgrade (brew list --cask)。 对我有用。

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

brew upgrade --cask --greedy

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

brew list --cask | xargs brew upgrade

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

brew upgrade --cask

不再适合我。

我已经使用 Homebrew 一段时间了(现在是 2022 年),这是我最喜欢的一行命令 运行 每天早上冲咖啡时使用一次。如果您将所有或大部分应用程序作为 casks 并由 Homebrew 管理,并且出于新功能和安全原因希望获得最新更新,那么这非常好。

警告:

  1. 请勿在可靠性和稳定性至关重要的工作环境中使用。虽然不断更新最新的安全更新听起来是个好主意,但一旦更新发布就立即获取更新并不是一个好主意。
  2. 如果您是软件开发人员,请修改此命令 并删除brew upgrade --greedy。这是因为在更新与您的开发环境的兼容性之前,最好先检查过时的 formulae/casks 版本。您最好手动升级您确定不会干扰您的项目的特定 formulae/casks,并且通常需要检查发行说明。单独更新casks/formulae时,使用brew upgrade cask_name_here.

命令如下: brew update && brew outdated --greedy && brew upgrade --greedy && brew cleanup

让我们解释一下这是做什么的。

brew update 命令用于在我们执行任何其他操作之前更新 Homebrew 本身。

brew outdated --greedy 命令用于列出所有 casks/formulae 有可用更新。 greedy 参数指定自动更新自身的应用程序和带有 version:latest 标记的应用程序应包含在此列表中。

brew upgrade --greedy命令用于更新所有以前被列为过时的casks/formulae。 greedy 参数指定自动更新自身的应用程序和带有 version:latest 标记的应用程序应包含在此更新过程中。请注意,如果您在 运行 执行此命令后在终端中没有看到任何输出,则表示没有要更新的内容,与 brew outdated 命令不同,此命令不会向终端发回消息通知用户没有什么需要更新的。

brew cleanup 命令删除所有公式和桶的旧锁定文件和过时下载,并删除已安装公式的旧版本。简而言之,这些 casks/formulae.

之前版本的旧文件或剩余文件

开发人员和工作环境的潜在解决方案 如果您想如上所述使用此解决方案并且在 Homebrew 中有关键依赖项,则有一个解决方案:

brew pin [package_name_here]

当使用上述命令更新所有包时,pin 命令将阻止 Homebrew 更新指定的包。 For more information, here is the pull request where the feature was added to Homebrew.