Actualice todos los barriles instalados a través de Homebrew Cask

159

Uso Homebrew Cask para instalar aplicaciones en OS X. ¿Cómo actualizo todos los barriles instalados?

enrico.bacis
fuente
3
Pregunta adjunta: "¿cómo podría actualizar uno de los barriles?"
Matthew Harwood
Estaría muy interesado en eso ... no parece haber ninguna forma de actualizar un barril, pero no tiene sentido. Tengo Brackets 1.3 instalado y he instalado complementos dentro de los corchetes. Ahora que 1.4 está fuera, me gustaría actualizar, pero mantener los complementos. No veo cómo se supone que debo hacer eso.
Jean-François Beauchef
Con respecto a los Brackets específicamente, las extensiones de usuario en OS X para Brackets se almacenan ~/Library/Application Support/Brackets/extensions/user, y estas deberían persistir en las actualizaciones. De hecho, los complementos del sistema se almacenan dentro del paquete de la aplicación Brackets.app/extensions/defaulty se pierden cuando reemplaza el paquete de la aplicación, pero la forma más sencilla sería copiar los complementos del paquete anterior al nuevo.
Caleb Xu
FYI: Implementarbrew cask upgrade 15 commits combinados en Homebrew: master
l --marc l
La única forma en que he encontrado para actualizar un solo barril es brew cask uninstall my-cool-caskentonces brew cask install my-cool-cask.
Aaron Gray

Respuestas:

295

¡Ahora finalmente hay un mecanismo de actualización oficial para Homebrew Cask (vea el número 3396 para la implementación)! Para usarlo, simplemente ejecute este comando:

brew cask upgrade

Sin embargo, esto no actualizará los barriles que no tengan información de versiones ( version :latest) o aplicaciones que tengan un mecanismo de actualización incorporado ( auto_updates true). Para reinstalar estos barriles (y, en consecuencia, actualizarlos si hay actualizaciones disponibles), ejecute el comando de actualización con el --greedyindicador como este:

brew cask upgrade --greedy

scribblemaniac
fuente
3
Gracias @mipadi por copiar mi respuesta a continuación en esta sin siquiera citar o votar. De todos modos, este parece completo.
enrico.bacis
3
@ enrico.bacis: frío. No vi su respuesta, y esta es una adición obvia. (Y para que conste, que debería haber editado esta respuesta en lugar de añadir uno nuevo.)
mipadi
2
Esto realmente me molestó, así que creé este script para actualizar todas las aplicaciones Brew y permitir al usuario elegir qué aplicaciones Cask actualizar. También puede excluir las aplicaciones de la consideración. github.com/derrekyoung/ScriptsAndUtils/blob/master/…
Derrek
14
Ahora puede usar brew cask outdated | xargs brew cask reinstallsolo para reinstalar barriles obsoletos.
phdoerfler
2
Es importante tener en cuenta que brew cask outdatedsolo imprime los nombres de las aplicaciones que no tienen habilitada la "actualización automática". Para actualizar TODAS las aplicaciones que están desactualizadas, usebrew cask outdated --greedy --verbose | grep -v '(latest)' | awk '{print $1}' | xargs brew cask reinstall
jmk
48

homebrew-cask-upgrade

Creo que esta es, con mucho, la mejor solución para actualizar los barriles.
fuente: https://github.com/buo/homebrew-cask-upgrade

Instalación y uso

brew tap buo/cask-upgrade
brew update
brew cu

(Opcional) Fuerce la actualización de aplicaciones desactualizadas, incluidas las marcadas como más recientes:

brew cu --all
Atais
fuente
@XingangHuang sí
ovnia
26

Es posible enumerar los barriles instalados con:

brew cask list

Y forzar la reinstalación de un barril con:

brew cask install --force CASK_NAME

Así que canalizando la salida del primer comando al segundo, actualizamos todos los barriles:

brew cask list | xargs brew cask install --force
enrico.bacis
fuente
1
Eso realmente no actualiza los barriles. Fuerza la reinstalación, incluso para los barriles que no tienen actualizaciones disponibles. Dependiendo de cuántos barriles haya instalado y cuánto tiempo hayan estado instalados, esto podría provocar descargas innecesarias, tomar mucho tiempo y solicitar el acceso a sudo.
Burhan Ali
20

Bash script para actualizar paquetes

inspirado en la respuesta de 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

Que hace

  • actualizar brew / brew cask, limpieza
  • lee la lista de barriles
  • verifique la brew cask infoversión más nueva
  • instale una nueva versión si está disponible (¡y elimina todas las versiones antiguas!)

fuente: https://gist.github.com/atais/9c72e469b1cbec35c7c430ce03de2a6b

un forro para impacientes:

curl -s https://gist.githubusercontent.com/atais/9c72e469b1cbec35c7c430ce03de2a6b/raw/36808a0544628398f26b48f7a3c7b309872ca2c6/cask_upgrade.sh | bash /dev/stdin

guardar como /usr/local/bin/cask-upgrade , para que pueda ejecutarlo localmente más cask-upgradetarde

Atais
fuente
¿No puedes simplemente hacer brew cask info $cask | grep "Not installed"?
Det.
@Det hah ... bueno, no lo vi, pero ahora sí. Bueno, podría hacerlo en la próxima versión ;-)
Atais
1
$ brew cask info $cask | grep "Not installed"da el errorError: This command requires a Cask token
eduncan911
1
@ eduncan911 lo usas con el script, después delfor cask in ${casks[@]}; do
Det
smacks head¡obviamente! No puedo creer que no haya entendido eso.
eduncan911
11

A partir de diciembre de 2017 uso: actualización de brew cask

[DEPRECADO desde diciembre de 2017 cuando Homebrew introdujo el comando de actualización para barrica] Simplemente uso lo siguiente:

brew cask outdated | xargs brew cask reinstall

Bojoer
fuente
Básicamente lo que hago también, excepto que he estado haciendo conexiones awk '{print $1}'entre los dos.
Paul Nelson Baker
6

Aquí está la función que he escrito para manejar esto. Tenga en cuenta que personalmente no quería que solo reinstalara ciegamente todo, ya que algunos de los barriles que uso tardan un tiempo en instalarse o requieren indicaciones adicionales.

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
fuente
Estoy ejecutando OS X El Capitan, pero cuando probé esta función, tuve errores de arrojar el shell porque - no es un carácter permitido en los nombres de funciones . Distinción importante: aunque funciona en bash, no está permitido para sh, por lo que si está usando #! / Bin / sh para la compatibilidad entre sistemas con múltiples shells, esto no funcionaría. Sin embargo, cambiar los guiones a guiones bajos funciona bien.
Bryan 'BJ' Hoffpauir Jr.
5

Basado en la respuesta de @Atais, he mejorado su lógica en algo más agradable. Quería una forma de inspeccionar los paquetes que se actualizaron primero, antes de forzar la actualización.

  • $ brew-cask.shsolo enumera una salida similar a la de Homebrew brew update.
  • la lista anterior muestra todos los paquetes instalados, con un verde que indica las actualizaciones pendientes.
  • $ brew-cask.sh upgrade forzará la actualización de esos paquetes.

Código:

# 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

simplemente instálelo (también conocido como "¡Lo necesito ahora!")

Está registrado en mi .dotfilesrepositorio ; por lo tanto, puede instalarlo rápidamente en su ~/bincon:

$ 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

Luego úsalo así:

$ brew-cask.sh
$ brew-cask.sh upgrade

Si no tiene ~/binen su camino, prefijo ~/bin/a las declaraciones anteriores.

eduncan911
fuente
5

brew cask upgrade

El upgradecomando se ha introducido recientemente en Homebrew Cask y debe desaprobar todos los demás métodos manuales descritos en las otras respuestas.

enrico.bacis
fuente
Aunque este comando existe, realmente no actualiza varios paquetes.
Acumenus
4

Creo que usando

brew cask reinstall `brew cask outdated`

Hará el truco. Esto también ayudará a eliminar las versiones anteriores de la aplicación e instalará la versión más reciente.

Pranab Agarwal
fuente
2
esto debería ser ahorabrew cask reinstall `brew cask outdated`
gbonetti
1
Gracias por la actualización @gbonetti. Estás en lo correcto. Con la nueva opción "obsoleta", la tarea se vuelve más fácil y rápida también :-).
Pranab Agarwal
2

mejorando el código proporcionado por deinspanjer, traté de imitar un comando noop, muy parecido al de chocolatey ( actualización de choco --noop / choco desactualizado ).

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

Como se puede ver, estoy usando un enfoque modular ya que mi caso de uso difiere un poco. No quiero sentarme frente a mi computadora y escribir sí / no para cada aplicación que haya instalado. Si bien no hay una forma real de actualizar los barriles (solo reinstalar la versión más reciente), primero preparo la actualización para tener la información de que realmente hay actualizaciones disponibles .

A continuación, recorro todos los barriles para mostrar su información. Debido a que preparé la actualización antes, ahora se proporciona una con la información de que la última versión de cask no está instalada.

Dentro de mi método de actualización, en realidad analizo el comando de información para esa línea específica:

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

Lo que se traduce en: "Proporcione las 3 líneas anteriores de la información proporcionada cada vez que lea la línea" no instalada ". Luego elimine cualquier línea que tenga un enlace, también elimine una línea que tenga un ':' en ella".

Dada la estructura del comando de información brew cask, terminamos con una línea (sin información de versión, sin URL de aplicación), que refleja el nombre real del barril con el que también se instaló.

salida de información de barril de cerveza

En mi versión, esta información ahora se imprime para que uno pueda ver fácilmente qué barriles están desactualizados y podrían actualizarse.

En este punto hago un caso de cambio, porque tal vez en este momento no hay suficiente tiempo para actualizar las cosas. Depende de su caso de uso. Para mí, a veces solo quiero ver qué hay de nuevo (esperando una nueva versión, una corrección de errores) pero en realidad no tengo tiempo para actualizar las cosas porque en este momento no quiero cerrar mi navegador, etc.

Por lo tanto, si uno opta por "sí", la lista de nombres limpios de los barriles se proporciona a la función de actualización donde se emite la reinstalación de cada barril que se determinó que estaba desactualizado.

Gracias de nuevo a deinspanjer, mientras trataba de resolver este problema por mí mismo, siempre olvidé emitir una actualización de preparación de antemano, por lo que no había una línea "no instalada" para analizar realmente (la base de todo mi enfoque).

Espero que esto haya sido útil.

Kevin N
fuente
2

Hice tal guión por mí mismo. Mire el github https://github.com/pesh1983/brew_cask_upgrade . Tiene una descripción bastante buena, pero si tiene alguna pregunta adicional, no dude en preguntarme. Realiza una actualización justa: desinstala e instala, por lo que cualquier limpieza necesaria será realizada por 'brew'.

Pavel Goltsev
fuente
2
brew cask outdated | xargs brew cask reinstall --force
Omar Albeik
fuente
2

obtener barriles obsoletos:

barril de cerveza anticuado

barril de actualización:

barril de cerveza reinstalar barril obsoleto

script de demostración:

$ 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}"
Wanming Zhang
fuente
2

Verifique los barriles obsoletos:

barril de cerveza anticuado

Actualización de todos los barriles obsoletos:

actualización de barril de cerveza

Si desea actualizar un barril específico, simplemente agregue el nombre del barril después de la actualización (por ejemplo: 4k-video-downloader):

actualización de brew cask 4k-video-downloader

Amir Marmul
fuente
2
Hola, bienvenido a StackOverflow. Dado que esta es una pregunta antigua con múltiples respuestas, una de las cuales es extremadamente popular y aceptada, edite su respuesta para dar más detalles sobre cómo responde la pregunta y por qué es preferible a las respuestas existentes. Gracias.
MandyShaw
1

Según lo que he leído, he creado un script que creará un archivo que enumera los archivos que se actualizarán, incluidas las aplicaciones que se definen como las más recientes. Luego puede modificar el archivo para adaptarlo a sus requisitos e instalar actualizaciones utilizando mi script olinst.

Para más información visita mi github.

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

Paul Cav
fuente
1

yo suelo

brew cask install --force `brew cask list`
goksel
fuente