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

enr*_*cis 134 macos homebrew homebrew-cask

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

scr*_*iac 246

2017年12月更新

我认为它永远不会发生,但现在终于有一个Homebrew Cask的官方升级机制(参见问题3396的实现)!要使用它,只需运行以下命令:

brew cask upgrade

但是,这不会更新没有版本控制信息的存储桶(version :latest)或具有内置升级机制的应用程序(auto_updates true).要重新安装这些磁盘(并在升级可用时升级它们),请运行带有以下--greedy标志的upgrade命令:

brew cask upgrade --greedy

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

我找到了一些更新,因为这是最初的答案.要获得解决方法,您现在可以使用brew cask upgrade:

__PRE__

问题原始答案中提到的问题4678已关闭,现在在问题#29301中讨论了升级功能. 还有buo/homebrew- cask -upgrade,这是一个向brew cask添加升级命令的外部包.我已成功测试了几个包.

原始答案

没有官方方法来升级自制垃圾桶.目前正在开展这项工作,但距离完成还有很长的路要走.有关详细信息,请参阅问题#4678.该问题还有一些用户用来升级所有漏洞的脚本示例.升级单个桶的最简单方法是运行version :latest,但只知道这可能会导致您的应用程序出现问题,因为它将无法首先正确卸载.通常这不是问题.

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

__PRE__

为了将来参考,可以在github上重复问题中找到更多详细信息.

  • 你现在可以使用`brew cask outdated | xargs brew cask重新安装`只能重新安装过时的桶. (13认同)
  • 感谢@mipadi将我的答案复制到这个中,甚至没有引用或提升.无论如何现在这个似乎完整. (3认同)
  • @ enrico.bacis:冷静.我没有看到你的答案,这是一个明显的补充.(为了记录,_you_应该编辑这个答案,而不是添加一个新答案.) (3认同)
  • 这真让我烦恼,所以我创建了这个脚本来更新所有Brew应用程序,并允许用户选择要更新的Cask应用程序.您也可以考虑排除应用.https://github.com/derrekyoung/ScriptsAndUtils/blob/master/brew-cask-upgrade.sh (2认同)
  • 重要的是要注意,`brew cask outdated` 只打印没有启用“自动更新”的应用程序的名称。要升级所有过时的应用程序,请使用`brew cask outdated --greedy --verbose | grep -v '(最新)' | awk '{print $1}' | xargs brew cask重新安装` (2认同)
  • 命令发生了变化,我非常喜欢它,所以这里是更新的命令:`brew outdated --cask --greedy --verbose | grep -v '(最新)' | awk '{print $1}' | xargs brew 重新安装 --cask` (2认同)

Ata*_*ais 44

自制-木桶升级

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

安装和使用

brew tap buo/cask-upgrade
brew update
brew cu
Run Code Online (Sandbox Code Playgroud)

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

brew cu --all
Run Code Online (Sandbox Code Playgroud)


enr*_*cis 26

可以列出已安装的桶:

brew cask list
Run Code Online (Sandbox Code Playgroud)

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

brew cask install --force CASK_NAME
Run Code Online (Sandbox Code Playgroud)

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

brew cask list | xargs brew cask install --force
Run Code Online (Sandbox Code Playgroud)

  • 那并没有真正更新木桶。它会强制重新安装,即使对于没有可用更新的木桶也是如此。根据您安装了多少桶以及它们安装了多长时间,这可能会触发不必要的下载,花费大量时间并提示 sudo 访问。 (2认同)

小智 20

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


Ata*_*ais 19

用于升级包的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
Run Code Online (Sandbox Code Playgroud)

它能做什么

  • 更新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
Run Code Online (Sandbox Code Playgroud)

另存为 /usr/local/bin/cask-upgrade,因此您可以在本地运行cask-upgrade


Nic*_*ist 14

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

警告:

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

这是命令: brew update && brew outdated --greedy && brew upgrade --greedy && brew cleanup

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

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

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

brew upgrade --greedy命令用于更新之前列为过时的所有桶/配方。贪婪参数指定自动更新自身的应用程序以及带有 version:latest 标记的应用程序应包含在此更新过程中。请注意,如果运行此命令后在终端中没有看到任何输出,则意味着没有任何内容需要更新,与该命令不同,此brew outdated命令不会向终端发送消息,通知用户没有任何内容需要更新。

brew cleanup命令删除所有公式和桶的旧锁定文件和过时的下载,并删除已安装公式的旧版本。简而言之,这些木桶/配方的先前版本中的旧文件或剩余文件。


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

brew pin [package_name_here]
Run Code Online (Sandbox Code Playgroud)

当使用上述命令更新所有包时,pin 命令将阻止 Homebrew 更新指定的包。有关更多信息,请参阅以下拉取请求,其中该功能已添加到 Homebrew 中


小智 12

brew list --cask | xargs brew upgrade
Run Code Online (Sandbox Code Playgroud)

这会循环显示brew cask安装的所有应用程序,并一次升级一个。

brew upgrade --cask
Run Code Online (Sandbox Code Playgroud)

不再适合我。


Boj*_*oer 11

截至2017年12月使用: brew cask升级

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

brew cask outdated | xargs brew cask reinstall
Run Code Online (Sandbox Code Playgroud)


小智 9

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

brew upgrade --cask --greedy
Run Code Online (Sandbox Code Playgroud)


dei*_*jer 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 
} 
Run Code Online (Sandbox Code Playgroud)


Hom*_*mer 6

升级所有未标记为“自动升级”的木桶

brew upgrade --cask
Run Code Online (Sandbox Code Playgroud)

升级所有木桶(“可自动升级”而不是“可自动升级”)

brew upgrade --cask --greedy
Run Code Online (Sandbox Code Playgroud)


edu*_*911 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
Run Code Online (Sandbox Code Playgroud)

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

它已检查到我的.dotfilesrepo 中;因此,您可以通过以下方式快速安装它~/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
Run Code Online (Sandbox Code Playgroud)

然后像这样使用它:

$ brew-cask.sh
$ brew-cask.sh upgrade
Run Code Online (Sandbox Code Playgroud)

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


enr*_*cis 5

brew cask upgrade

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