Aggiorna tutte le botti installate tramite Homebrew Cask


159

Uso Homebrew Cask per installare applicazioni su OS X. Come posso aggiornare tutte le botti installate?


3
Domanda allegata: "come potrei aggiornare una delle botti?"
Matthew Harwood,

Sarei molto interessato a questo ... non sembra esserci alcun modo per aggiornare una botte, ma non ha senso. Ho Brackets 1.3 installato e ho installato plugin tra parentesi. Ora che 1.4 è uscito, mi piacerebbe aggiornare, ma mantenere i plug-in. Non vedo come dovrei farlo.
Jean-François Beauchef,

Per quanto riguarda in particolare le parentesi quadre, le estensioni utente su OS X per le parentesi quadre sono memorizzate ~/Library/Application Support/Brackets/extensions/usere dovrebbero persistere durante gli aggiornamenti. I plug-in di sistema sono effettivamente archiviati nel bundle dell'app Brackets.app/extensions/defaulte questi vengono persi quando si sostituisce il bundle dell'app, ma il modo più semplice sarebbe semplicemente copiare i plug-in dal vecchio bundle a quello nuovo.
Caleb Xu,

FYI: Implement habrew cask upgrade unito 15 commit in Homebrew: master
l --marc l

L'unico modo che ho trovato per aggiornare una singola botte è brew cask uninstall my-cool-caskquindi brew cask install my-cool-cask.
Aaron Grey il

Risposte:


295

Ora c'è finalmente un meccanismo ufficiale di aggiornamento per Homebrew Cask (vedi il numero 3396 per l'implementazione)! Per usarlo, basta eseguire questo comando:

brew cask upgrade

Tuttavia, questo non aggiornerà i botti che non hanno informazioni sulla versione ( version :latest) o le applicazioni che hanno un meccanismo di aggiornamento incorporato ( auto_updates true). Per reinstallare queste botti (e di conseguenza aggiornarle se sono disponibili aggiornamenti), eseguire il comando upgrade con il --greedyflag in questo modo:

brew cask upgrade --greedy


3
Grazie @mipadi per aver copiato la mia risposta qui sotto in questa senza nemmeno citare o votare. Comunque ora questo sembra completo.
enrico.bacis,

3
@ enrico.bacis: Chill. Non ho visto la tua risposta, e questa è un'ovvia aggiunta. (E per la cronaca, avresti dovuto modificare questa risposta invece di aggiungerne una nuova.)
mipadi

2
Questo mi ha davvero infastidito, quindi ho creato questo script per aggiornare tutte le app Brew e consentire all'utente di scegliere quali app Cask aggiornare. Puoi escludere anche le app. github.com/derrekyoung/ScriptsAndUtils/blob/master/…
Derrek

14
Ora puoi usare brew cask outdated | xargs brew cask reinstallsolo per reinstallare botti obsoleti.
phdoerfler,

2
È importante notare che brew cask outdatedstampa solo i nomi delle app che non dispongono di "aggiornamento automatico" abilitato. Per aggiornare TUTTE le app obsolete, utilizzarebrew cask outdated --greedy --verbose | grep -v '(latest)' | awk '{print $1}' | xargs brew cask reinstall
jmk

48

homebrew-botte-upgrade

Penso che questa sia di gran lunga la migliore soluzione per aggiornare le botti.
fonte: https://github.com/buo/homebrew-cask-upgrade

Installazione e utilizzo

brew tap buo/cask-upgrade
brew update
brew cu

(Facoltativo) Forza l'aggiornamento di app obsolete, comprese quelle contrassegnate come più recenti:

brew cu --all

@XingangHuang sì
ovnia

26

È possibile elencare le botti installate con:

brew cask list

E forzare la reinstallazione di una botte con:

brew cask install --force CASK_NAME

Quindi, eseguendo il piping dell'output del primo comando nel secondo, aggiorniamo tutti i barili:

brew cask list | xargs brew cask install --force

1
Questo non aggiorna davvero le botti. Forza la reinstallazione, anche per i botti che non hanno aggiornamenti disponibili. A seconda del numero di botti che hai installato e da quanto tempo sono installati, ciò potrebbe causare download non necessari, richiedere molto tempo e richiedere l'accesso sudo.
Burhan Ali,

20

Script di Bash per aggiornare i pacchetti

ispirato dalla risposta di 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

Cosa fa

  • aggiorna brew / brew botte, pulizia
  • leggi l'elenco delle botti
  • controlla la brew cask infoversione più recente
  • installa la nuova versione se disponibile (e rimuove tutte le vecchie versioni!)

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

una fodera per impaziente:

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

salva come /usr/local/bin/cask-upgrade , così puoi eseguirlo localmente come cask-upgradesuccessivamente


Non puoi farlo brew cask info $cask | grep "Not installed"?
Det

@Det hah ... beh non l'ho visto, ma lo faccio ora. Beh, potrei farlo nella prossima versione ;-)
Atais,

1
$ brew cask info $cask | grep "Not installed"dà l'erroreError: This command requires a Cask token
eduncan911

1
@ eduncan911 lo usi con lo script, dopo ilfor cask in ${casks[@]}; do
Det

smacks headovviamente! non posso credere di non averlo capito.
eduncan911

11

A partire da dicembre 2017 utilizzare: brew cask upgrade

[DEPRECATO da dicembre 2017 quando Homebrew ha introdotto il comando upgrade per botte] Uso semplicemente quanto segue:

brew cask outdated | xargs brew cask reinstall


Fondamentalmente quello che faccio anche io, tranne per il fatto che sono stato convocato awk '{print $1}'tra i due.
Paul Nelson Baker,

6

Ecco la funzione che ho scritto per gestirlo. Nota che personalmente non volevo che reinstallasse ciecamente tutto poiché alcune delle botti che utilizzo impiegano un po 'di tempo per l'installazione o richiedono ulteriori suggerimenti.

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 
} 

Sto eseguendo OS X El Capitan, ma quando ho testato questa funzione, ho avuto la shell vomitare errori perché - non è un carattere consentito nei nomi delle funzioni . Distinzione importante - sebbene funzioni in bash non è consentito per sh, quindi se si utilizza #! / Bin / sh per la compatibilità tra sistemi con più shell, ciò non funzionerebbe. Tuttavia, la modifica dei trattini in caratteri di sottolineatura funziona correttamente.
Bryan 'BJ' Hoffpauir Jr.

5

Basato sulla risposta di @Atais, ho migliorato la sua logica in qualcosa di più bello. Volevo un modo per ispezionare prima i pacchetti prima di forzare l'aggiornamento.

  • $ brew-cask.shelenca solo un output simile a quello di Homebrew brew update.
  • l'elenco sopra mostra tutti i pacchetti installati, con un verde che indica eventuali aggiornamenti in sospeso.
  • $ brew-cask.sh upgrade forzerà l'aggiornamento di quei pacchetti.

Codice:

# 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

basta installarlo (aka "Ne ho bisogno ora!")

È registrato nel mio .dotfilesrepository ; quindi, puoi installarlo rapidamente nel tuo ~/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

Quindi usalo così:

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

Se non hai ~/binnel tuo percorso, aggiungi ~/bin/il prefisso alle istruzioni precedenti.


5

brew cask upgrade

Il upgradecomando è stato recentemente introdotto in Homebrew Cask e dovrebbe deprecare tutti gli altri metodi manuali descritti nelle altre risposte.


Sebbene questo comando esista, in realtà non aggiorna un numero di pacchetti.
Acumenus,

4

Penso che usando

brew cask reinstall `brew cask outdated`

farà il trucco. Questo aiuterà anche a rimuovere la versione precedente dell'applicazione e installerà la versione più recente.


2
ora dovrebbe esserebrew cask reinstall `brew cask outdated`
gbonetti,

1
Grazie per l'aggiornamento @gbonetti. Hai ragione. Con la nuova opzione "obsoleta", l'attività diventa anche più semplice e veloce :-).
Pranab Agarwal,

2

migliorando il codice fornito da deinspanjer, ho cercato di imitare un comando noop, proprio come quello di chocolatey ( aggiornamento choco --noop / choco obsoleto ).

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

Come si può vedere, sto usando un approccio modulare poiché il mio caso d'uso differisce leggermente. Non voglio sedermi di fronte al mio computer e digitare yes / no per ogni app che ho installato. Anche se non esiste un modo reale di aggiornare i barili (solo la reinstallazione della versione più recente), per prima cosa eseguo l'aggiornamento per avere le informazioni che ci sono effettivamente aggiornamenti disponibili .

Successivamente, scorro tutte le botti per visualizzare le loro informazioni. Dato che ho già fatto l'aggiornamento in precedenza, ora viene fornita l'informazione che l'ultima versione di alcuni cask non è installata.

All'interno del mio metodo di aggiornamento, in realtà analizzo il comando info per quella riga specifica:

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

Il che si traduce in: "Fornisci le 3 righe sopra delle informazioni fornite ogni volta che leggi la riga" non installata ". Quindi elimina tutte le righe che contengono un link, elimina anche una riga che contenga un": "."

Data la struttura del comando info cask brew, finiamo con una riga (nessuna informazione sulla versione, nessun URL dell'app), che riflette il nome effettivo della cask con cui è stato installato.

produrre informazioni sulla botte

Nella mia versione, queste informazioni sono ora stampate in modo da poter vedere facilmente quali barili non sono aggiornati e potrebbero essere aggiornati.

A questo punto faccio uno switch case, perché forse in questo momento non è abbastanza tempo per aggiornare le cose. Dipende dal tuo caso d'uso. Per me, a volte voglio solo vedere cosa c'è di nuovo (aspettando una nuova versione, una correzione di bug) ma in realtà non ho tempo di aggiornare le cose perché in questo momento non voglio chiudere il mio browser ecc.

Quindi, se si opta per "sì", l'elenco di nomi puliti di botti viene dato alla funzione di aggiornamento in cui per ogni botte che è stato giudicato obsoleto viene emessa la reinstallazione.

Grazie ancora a deinspanjer, mentre cercavo di risolvere questo problema da solo, ho sempre dimenticato di inviare in anticipo l'aggiornamento della birra, quindi non c'era una linea "non installata" per analizzare effettivamente (le basi del mio intero approccio).

Spero sia stato utile.


2

Ho realizzato questa sceneggiatura da solo. Consulta il github https://github.com/pesh1983/brew_cask_upgrade . Ha una descrizione abbastanza buona, ma se hai qualche domanda in più, sentiti libero di chiedermelo. Effettua un aggiornamento equo: disinstallare e installare, quindi qualsiasi pulizia necessaria verrà eseguita da 'brew' stesso.



2

ottenere botti obsolete:

botte di birra obsoleta

botte di aggiornamento:

brew cask reinstallare obsoleto-botte

script demo:

$ 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}"

2

Controlla le botti obsolete:

botte di birra obsoleta

Aggiornamento di tutti i barili obsoleti:

aggiornamento botte di birra

Se si desidera aggiornare una botte specifica, basta aggiungere il nome della botte dopo l'aggiornamento (es: 4k-video-downloader):

brew cask upgrade 4k-video-downloader


2
Ciao, benvenuto su StackOverflow. Dato che questa è una vecchia domanda con risposte multiple, una delle quali è estremamente popolare e accettata, si prega di modificare la risposta per fornire maggiori dettagli su come risponde alla domanda e perché è preferibile alle risposte esistenti. Grazie.
MandyShaw il

1

Sulla base di ciò che ho letto, ho creato uno script che creerà un file che elenca i file da aggiornare, incluse le app definite come ultime. È quindi possibile modificare il file in base alle proprie esigenze e installare gli aggiornamenti utilizzando il mio script olinst.

Per maggiori informazioni visita il mio github.

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



1

Io uso

brew cask install --force `brew cask list`
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.