Mettez à niveau tous les fûts installés via Homebrew Cask

159

J'utilise Homebrew Cask pour installer des applications sur OS X. Comment mettre à niveau tous les casks installés?

enrico.bacis
la source
3
Question en annexe: "Comment pourrais-je simplement améliorer l'un des fûts?"
Matthew Harwood
Cela m'intéresserait beaucoup ... il ne semble pas y avoir de moyen de mettre à niveau un fût, mais cela n'a pas de sens. J'ai installé Brackets 1.3 et j'ai installé des plugins entre parenthèses. Maintenant que la version 1.4 est sortie, j'aimerais mettre à niveau, mais gardez les plug-ins. Je ne vois pas comment je suis censé faire ça.
Jean-François Beauchef
En ce qui concerne spécifiquement Brackets, les extensions utilisateur sur OS X pour Brackets sont stockées dans ~/Library/Application Support/Brackets/extensions/user, et celles-ci devraient persister lors des mises à niveau. Les plugins système sont en effet stockés dans le bundle d'applications dans Brackets.app/extensions/default, et ceux-ci sont perdus lorsque vous remplacez le bundle d'applications, mais le moyen le plus simple serait de simplement copier les plugins de l'ancien bundle vers le nouveau.
Caleb Xu
FYI: Implémenterbrew cask upgrade 15 commits fusionnés dans Homebrew: master
l --marc l
La seule façon que j'ai trouvé pour mettre à niveau un seul tonneau est brew cask uninstall my-cool-caskalors brew cask install my-cool-cask.
Aaron Gray le

Réponses:

295

Il existe enfin un mécanisme de mise à jour officiel pour Homebrew Cask (voir le numéro 3396 pour l'implémentation)! Pour l'utiliser, exécutez simplement cette commande:

brew cask upgrade

Cependant, cela ne mettra pas à jour les casks qui n'ont pas d'informations de version ( version :latest) ou les applications qui ont un mécanisme de mise à niveau intégré ( auto_updates true). Pour réinstaller ces boîtiers (et par conséquent les mettre à niveau si des mises à niveau sont disponibles), exécutez la commande de mise à niveau avec l' --greedyindicateur comme ceci:

brew cask upgrade --greedy

scribblemaniac
la source
3
Merci @mipadi d'avoir copié ma réponse ci-dessous dans celle-ci sans même citer ou voter. Quoi qu'il en soit maintenant celui-ci semble complet.
enrico.bacis
3
@ enrico.bacis: Chill. Je n'ai pas vu votre réponse, et c'est un ajout évident. (Et pour mémoire, vous auriez dû modifier cette réponse au lieu d'en ajouter une nouvelle.)
mipadi
2
Cela m'a vraiment énervé, j'ai donc créé ce script pour mettre à jour toutes les applications Brew et permettre à l'utilisateur de choisir les applications Cask à mettre à jour. Vous pouvez également exclure les applications de la considération. github.com/derrekyoung/ScriptsAndUtils/blob/master/…
Derrek
14
Vous pouvez désormais l'utiliser brew cask outdated | xargs brew cask reinstallpour réinstaller uniquement les fûts obsolètes.
phdoerfler
2
Il est important de noter que cela brew cask outdatedn'imprime que les noms des applications pour lesquelles la «mise à jour automatique» n'est pas activée. Pour mettre à niveau TOUTES les applications obsolètes, utilisezbrew cask outdated --greedy --verbose | grep -v '(latest)' | awk '{print $1}' | xargs brew cask reinstall
jmk
48

mise à niveau homebrew-cask

Je pense que c'est de loin la meilleure solution pour mettre à niveau les fûts.
source: https://github.com/buo/homebrew-cask-upgrade

Installation et utilisation

brew tap buo/cask-upgrade
brew update
brew cu

(Facultatif) Forcer la mise à niveau des applications obsolètes, y compris celles marquées comme les plus récentes:

brew cu --all
Atais
la source
@XingangHuang oui
ovnia
26

Il est possible de lister les fûts installés avec:

brew cask list

Et forcez la réinstallation d'un fût avec:

brew cask install --force CASK_NAME

Donc, en passant la sortie de la première commande dans la seconde, nous mettons à jour tous les fûts:

brew cask list | xargs brew cask install --force
enrico.bacis
la source
1
Cela ne met pas vraiment à jour les fûts. Cela force la réinstallation, même pour les fûts pour lesquels aucune mise à jour n'est disponible. Selon le nombre de casks que vous avez installés et la durée de leur installation, cela peut déclencher des téléchargements inutiles, prendre beaucoup de temps et demander un accès sudo.
Burhan Ali
20

Script bash pour mettre à niveau les packages

inspiré de la réponse 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

Ce qu'il fait

  • mettre à jour le fût de brassage / brassage, nettoyage
  • lire la liste des fûts
  • vérifiez la brew cask infoversion la plus récente
  • installer la nouvelle version si disponible (et supprime toutes les anciennes versions!)

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

une doublure pour les impatients:

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

enregistrer sous /usr/local/bin/cask-upgrade , afin que vous puissiez l'exécuter localement comme cask-upgradeplus tard

Atais
la source
Tu ne peux pas le faire brew cask info $cask | grep "Not installed"?
Dét
@Det hah ... eh bien je ne l'ai pas vu, mais je le fais maintenant. Eh bien, je pourrais le faire dans la prochaine version ;-)
Atais
1
$ brew cask info $cask | grep "Not installed"donne l'erreurError: This command requires a Cask token
eduncan911
1
@ eduncan911 vous l'utilisez avec le script, après lefor cask in ${casks[@]}; do
Det
smacks headévidemment! Je ne peux pas croire que je n'ai pas compris ça.
eduncan911
11

À partir de décembre 2017, utilisation: mise à niveau du fût de bière

[DEPRECATED depuis décembre 2017 lorsque Homebrew a introduit la commande de mise à niveau pour cask] J'utilise simplement ce qui suit:

brew cask outdated | xargs brew cask reinstall

Bojoer
la source
Fondamentalement, ce que je fais aussi, sauf que je me suis mis awk '{print $1}'entre les deux.
Paul Nelson Baker
6

Voici la fonction que j'ai écrite pour gérer cela. Notez que personnellement, je ne voulais pas qu'il réinstalle tout aveuglément car certains des fûts que j'utilise prennent un certain temps à installer ou nécessitent des invites supplémentaires.

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
la source
J'utilise OS X El Capitan, mais lorsque j'ai testé cette fonction, le shell a généré des erreurs car le - n'est pas un caractère autorisé dans les noms de fonction . Distinction importante - bien que cela fonctionne dans bash, il n'est pas autorisé pour sh, donc si vous utilisez #! / Bin / sh pour la compatibilité entre les systèmes avec plusieurs shells, cela ne fonctionnera pas. Changer les traits d'union en traits de soulignement fonctionne bien, cependant.
Bryan 'BJ' Hoffpauir Jr.
5

Sur la base de la réponse de @Atais, j'ai amélioré sa logique en quelque chose de plus agréable. Je voulais un moyen d'inspecter les paquets à mettre à niveau en premier, avant de forcer la mise à niveau.

  • $ brew-cask.shliste juste une sortie similaire à celle de Homebrew brew update.
  • la liste ci-dessus montre tous les packages installés, avec un vert indiquant les mises à jour en attente.
  • $ brew-cask.sh upgrade forcera la mise à jour de ces packages.

Code:

# 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

installez-le simplement (aka "J'en ai besoin maintenant!")

Il est enregistré dans mon .dotfilesrepo ; ainsi, vous pouvez l'installer rapidement dans votre ~/binavec:

$ 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

Ensuite, utilisez-le comme ceci:

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

Si vous n'en avez pas ~/bindans votre chemin, préfixez ~/bin/les instructions ci-dessus.

eduncan911
la source
5

brew cask upgrade

La upgradecommande a récemment été introduite dans Homebrew Cask et devrait rendre obsolète toutes les autres méthodes manuelles décrites dans les autres réponses.

enrico.bacis
la source
Bien que cette commande existe, elle ne met pas à niveau un certain nombre de packages.
Acumenus
4

Je pense en utilisant

brew cask reinstall `brew cask outdated`

fera l'affaire. Cela aidera également à supprimer la / les version (s) précédente (s) de l'application et installera la version la plus récente.

Pranab Agarwal
la source
2
cela devrait être maintenantbrew cask reinstall `brew cask outdated`
gbonetti
1
Merci pour la mise à jour @gbonetti. Vous avez raison. Avec la nouvelle option "obsolète", la tâche devient également plus facile et plus rapide :-).
Pranab Agarwal
2

en améliorant le code fourni par deinspanjer, j'ai essayé d'imiter une commande noop, un peu comme celle de chocolatey ( choco update --noop / choco obsolète ).

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

Comme on peut le voir, j'utilise une approche modulaire car mon cas d'utilisation diffère un peu. Je ne veux pas m'asseoir devant mon ordinateur et taper oui / non pour chaque application que j'ai installée. Bien qu'il n'y ait pas de moyen réel de mettre à niveau les fûts (juste la réinstallation de la version la plus récente), je fais d'abord une mise à jour de brassage pour avoir l'information qu'il existe réellement des mises à jour disponibles .

Ensuite, je parcours tous les fûts pour afficher leurs informations. Parce que j'ai fait une mise à jour de bière auparavant, on est maintenant fourni avec l'information que la dernière version de certains cask n'est pas installée.

Dans ma méthode de mise à jour, j'analyse la commande info pour cette ligne spécifique:

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

Ce qui se traduit par: "Donnez les 3 lignes ci-dessus d'informations fournies chaque fois que vous lisez la ligne" non installé ". Supprimez ensuite toute ligne contenant un lien, supprimez également une ligne contenant un ':'."

Compte tenu de la structure de la commande brew cask info, nous nous retrouvons avec une ligne (aucune information de version, aucune URL d'application), qui reflète le nom réel du cask avec lequel il a également été installé.

sortie d'informations sur le fût de bière

Dans ma version, cette information est maintenant imprimée afin que l'on puisse facilement voir quels fûts sont périmés et pourraient être mis à jour.

À ce stade, je fais un cas de commutation, car peut-être que le moment n'est pas suffisant pour mettre à jour les choses. Cela dépend de votre cas d'utilisation. Pour moi, je veux parfois juste voir les nouveautés (en attente d'une nouvelle version, un correctif) mais je n'ai pas le temps de mettre à jour les choses car pour le moment je ne veux pas fermer mon navigateur etc.

Ainsi, si l'on opte pour "oui", la liste des noms nettoyés des fûts est donnée à la fonction de mise à jour où pour chaque fût jugé obsolète, la réinstallation est émise.

Merci encore à deinspanjer, en essayant de résoudre ce problème par moi-même, j'ai toujours oublié de publier une mise à jour de brew à l'avance, il n'y avait donc pas de ligne "non installé" à analyser (le fondement de toute mon approche).

J'espère que cela a été utile.

Kevin N
la source
2

J'ai fait un tel scénario par moi-même. Veuillez consulter le github https://github.com/pesh1983/brew_cask_upgrade . Il a une assez bonne description, mais si vous avez des questions supplémentaires, n'hésitez pas à me les poser. Il fait une mise à niveau équitable: désinstallez et installez, donc tout nettoyage nécessaire sera effectué par «brassage» lui-même.

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

obtenir des fûts obsolètes:

tonneau de bière obsolète

mise à niveau du fût:

brew cask réinstaller le cask obsolète

script de démonstration:

$ 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
la source
2

Vérifiez les fûts périmés:

tonneau de bière obsolète

Mise à niveau de tous les fûts obsolètes:

mise à niveau du fût de bière

Si vous souhaitez mettre à niveau un cask spécifique, ajoutez simplement le nom du cask après la mise à niveau (ex: 4k-video-downloader):

mise à niveau du brew cask 4k-video-downloader

Amir Marmul
la source
2
Bonjour, bienvenue sur StackOverflow. Étant donné qu'il s'agit d'une ancienne question avec plusieurs réponses dont l'une est à la fois extrêmement populaire et acceptée, veuillez modifier votre réponse pour donner plus de détails sur la façon dont elle répond à la question et pourquoi elle est préférable aux réponses existantes. Merci.
MandyShaw
1

Sur la base de ce que j'ai lu, j'ai créé un script qui créera un fichier qui répertorie les fichiers à mettre à jour, y compris les applications définies comme les plus récentes. Vous pouvez ensuite modifier le fichier en fonction de vos besoins et installer les mises à jour à l'aide de mon script olinst.

Pour plus d'informations, visitez mon github.

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

Paul Cav
la source
1

j'utilise

brew cask install --force `brew cask list`
Goksel
la source