升级所有通过家酿桶安装的桶

我使用自酿酒桶在OS x上安装应用程序。如何升级所有已安装的桶?

113018 次浏览

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

brew upgrade --cask

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

brew upgrade --cask --greedy

变得过时:

brew outdated --cask --greedy --verbose

可以列出已安装的桶:

brew cask list

并强制重新安装桶与:

brew cask install --force CASK_NAME

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

brew cask list | xargs brew cask install --force

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

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
}

改进了deinspanjer,提供的代码,我试图模仿一个noop命令,很像来自chocolatey (Choco update—noop / Choco过时)的命令。

< a href = " https://git。io / vgjiL " rel = " https://git.io/vgjiL nofollow”> < / >

#!/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以获得实际有更新可用的信息

接下来,我循环遍历所有桶以显示它们的信息。因为我之前做了酿造更新,现在提供了一些桶的最新版本没有安装的信息。

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

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

这句话的意思是:“当你读到“未安装”这一行时,给出上面3行信息。然后删除任何有链接的行,也删除有“:”的行。”

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

酿造酒桶信息输出 .

在我的版本中,这些信息现在被打印出来,所以人们可以很容易地看到哪些木桶过时了,并可以更新。

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

因此,如果有人选择“是”,则将已清理的桶名列表提供给更新函数,其中对于每个被确定为过期的桶,将发布重新安装。

再次感谢deinspanjer,当我试图为自己解决这个问题时,我总是忘记事先发布brew更新,所以没有“未安装”行来实际解析(这是我整个方法的基础)。

我希望这对你们有帮助。

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 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 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回购;所以,你可以快速地将它安装到你的__abc1中:

$ 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

homebrew-cask-upgrade

< p > 我认为这是目前为止升级酒桶的最佳方案。 < br > 来源:< / em > 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`

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

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

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

[自2017年12月Homebrew为桶引入升级命令以来已弃用] 我简单地使用以下方法:

brew cask outdated | xargs brew cask reinstall

< / s >

买过时的酒桶:

酿酒桶过时了

升级桶:

酿造桶重新安装过时的桶

演示脚本:

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

brew cask upgrade

upgrade命令最近在Homebrew Cask中引入,应该不推荐在其他回答中描述的所有其他手动方法。

检查过时的酒桶:

酿酒桶过时了

升级所有过时的酒桶:

酿造桶升级

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

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

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

brew upgrade --cask

升级所有酒桶("auto-upgradable"而不是“自动升级”。)

brew upgrade --cask --greedy

我和鱼壳一起工作。 所以我使用: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 upgrade --cask

对我已经没用了。

我已经使用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]

当所有包都用上面的命令更新时,pin命令将停止Homebrew更新指定的包。有关更多信息,这里是将该功能添加到Homebrew的pull请求

for cask in $(brew list --cask); do brew upgrade --cask $cask; done;

一个简单的FOR循环迭代所有的桶,而不是手动升级一个接一个。