Atualize todos os barris instalados via Homebrew Cask

159

Uso o Homebrew Cask para instalar aplicativos no OS X. Como atualizo todos os barris instalados?

enrico.bacis
fonte
3
Pergunta anexa: "como eu atualizaria apenas um dos barris?"
Matthew Harwood
Eu ficaria muito interessado nisso ... não parece haver nenhuma maneira de atualizar um barril, mas não faz sentido. Eu tenho o Brackets 1.3 instalado e instalei plugins dentro dele. Agora que a versão 1.4 foi lançada, eu gostaria de atualizar, mas mantenha os plug-ins. Não vejo como devo fazer isso.
Jean-François Beauchef
Em relação aos Brackets especificamente, as extensões de usuário no OS X for Brackets são armazenadas ~/Library/Application Support/Brackets/extensions/usere devem persistir nas atualizações. Os plug-ins do sistema são realmente armazenados no pacote de aplicativos Brackets.app/extensions/defaulte são perdidos quando você substitui o pacote de aplicativos, mas a maneira mais fácil seria apenas copiar os plug-ins do pacote antigo para o novo.
Caleb Xu
FYI: Implementarbrew cask upgrade mesclado 15 commits no Homebrew: master
l --marc l
A única maneira que encontrei para atualizar um único barril é brew cask uninstall my-cool-caskentão brew cask install my-cool-cask.
Aaron Gray

Respostas:

295

Agora existe finalmente um mecanismo oficial de atualização para o Homebrew Cask (consulte a edição 3396 para a implementação)! Para usá-lo, basta executar este comando:

brew cask upgrade

No entanto, isso não atualizará os barris que não possuem informações sobre versão ( version :latest) ou aplicativos que possuem um mecanismo de atualização interno ( auto_updates true). Para reinstalar esses barris (e, consequentemente, atualizá-los se houver atualizações disponíveis), execute o comando upgrade com o --greedysinalizador como este:

brew cask upgrade --greedy

scribblemaniac
fonte
3
Obrigado @mipadi por copiar minha resposta abaixo para esta, mesmo sem citar ou votar. Enfim, agora este parece completo.
enrico.bacis
3
@ enrico.bacis: Relaxa. Não vi sua resposta, e esta é uma adição óbvia. (E para o registro, você deveria ter editado esta resposta em vez de adicionar um novo.)
mipadi
2
Isso realmente me irritou, então eu criei esse script para atualizar todos os aplicativos Brew e permitir que o usuário escolha quais aplicativos Cask serão atualizados. Você também pode excluir aplicativos da consideração. github.com/derrekyoung/ScriptsAndUtils/blob/master/…
Derrek
14
Agora você pode usar brew cask outdated | xargs brew cask reinstallpara reinstalar apenas barris desatualizados.
phdoerfler
2
É importante observar que brew cask outdatedapenas imprime nomes de aplicativos que não têm a "atualização automática" ativada. Para atualizar todos os aplicativos que estão desatualizados, o usobrew cask outdated --greedy --verbose | grep -v '(latest)' | awk '{print $1}' | xargs brew cask reinstall
jmk
48

homebrew-cask-upgrade

Eu acho que essa é de longe a melhor solução para atualizar os barris.
fonte: https://github.com/buo/homebrew-cask-upgrade

Instalação e uso

brew tap buo/cask-upgrade
brew update
brew cu

(Opcional) Force a atualização de aplicativos desatualizados, incluindo os marcados como mais recentes:

brew cu --all
Atais
fonte
@XingangHuang yes
ovnia
26

É possível listar os barris instalados com:

brew cask list

E force a reinstalação de um barril com:

brew cask install --force CASK_NAME

Então, canalizando a saída do primeiro comando para o segundo, atualizamos todos os barris:

brew cask list | xargs brew cask install --force
enrico.bacis
fonte
1
Isso realmente não atualiza os barris. Força a reinstalação, mesmo para barris que não possuem atualização disponível. Dependendo de quantos barris você instalou e por quanto tempo eles foram instalados, isso pode desencadear downloads desnecessários, levar muito tempo e solicitar acesso ao sudo.
Burhan Ali 28/01
20

Script Bash para atualizar pacotes

inspirado pela resposta 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

O que faz

  • atualizar fermentação / barril de fermentação, limpeza
  • leia a lista de barris
  • Verifica a brew cask info versão mais recente
  • instale uma nova versão, se disponível (e remove todas as versões antigas!)

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

um forro para impaciente:

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

salvar como /usr/local/bin/cask-upgrade , para que você possa executá-lo localmente mais cask-upgradetarde

Atais
fonte
Você não pode simplesmente fazer brew cask info $cask | grep "Not installed"?
Det
@Det hah ... bem, eu não vi, mas vejo agora. Bem, eu poderia fazê-lo em próxima versão ;-)
Atais
1
$ brew cask info $cask | grep "Not installed"dá o erroError: This command requires a Cask token
eduncan911 31/03
1
@ eduncan911 você usa com o script, após ofor cask in ${casks[@]}; do
Det
smacks headobviamente! Não posso acreditar que não entendi.
eduncan911
11

Em dezembro de 2017, use: atualização do barril de fermentação

[DEPRECADO desde dezembro de 2017, quando o Homebrew introduziu o comando de atualização para o barril] Simplesmente uso o seguinte:

brew cask outdated | xargs brew cask reinstall

Bojoer
fonte
Basicamente, o que eu faço também, exceto que eu tenho procurado awk '{print $1}'entre os dois.
Paul Nelson Baker
6

Aqui está a função que escrevi para lidar com isso. Observe que eu pessoalmente não queria que ele reinstale tudo cegamente, já que alguns dos barris que utilizo demoram um pouco para instalar ou exigem instruções adicionais.

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
fonte
Estou executando o OS X El Capitan, mas quando testei essa função, o shell exibia erros porque o - não é um caractere permitido nos nomes das funções . Distinção importante - embora funcione no bash, não é permitido para sh; portanto, se você estiver usando #! / Bin / sh para compatibilidade entre sistemas com vários shells, isso não funcionaria. Mudar os hífens para sublinhados funciona bem, no entanto.
Bryan 'BJ' Hoffpauir Jr. -
5

Com base na resposta de @Atais, aprimorei sua lógica para algo melhor. Eu queria uma maneira de inspecionar os pacotes a serem atualizados primeiro, antes de realmente forçar a atualização.

  • $ brew-cask.sh apenas lista uma saída semelhante à do Homebrew brew update .
  • a lista acima mostra todos os pacotes instalados, com um verde indicando as atualizações pendentes.
  • $ brew-cask.sh upgrade forçará a atualização desses pacotes.

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

basta instalá-lo (também conhecido como "preciso agora!")

Está registrado no meu .dotfilesrepositório ; então, você pode instalá-lo rapidamente no seu ~/bincom:

$ 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

Em seguida, use-o assim:

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

Se você não tiver ~/binno seu caminho, prefixe ~/bin/as instruções acima.

eduncan911
fonte
5

brew cask upgrade

O upgradecomando foi introduzido recentemente no Homebrew Cask e deve descontinuar todos os outros métodos manuais descritos nas outras respostas.

enrico.bacis
fonte
Embora esse comando exista, ele realmente não atualiza vários pacotes.
Acumenus 01/11/19
4

Eu acho que usando

brew cask reinstall `brew cask outdated`

fará o truque. Isso também ajudará a remover as versões anteriores do aplicativo e instalará a versão mais recente.

Pranab Agarwal
fonte
2
esta deve ser agorabrew cask reinstall `brew cask outdated`
gbonetti
1
Obrigado pela atualização @gbonetti. Você está certo. Com a nova opção "desatualizada", a tarefa também se torna mais fácil e rápida :-).
Pranab Agarwal
2

melhorando o código fornecido pelo deinspanjer, tentei imitar um comando noop, semelhante ao do chocolatey ( atualização do choco --noop / choco desatualizado ).

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 pode ver, estou usando uma abordagem modular, pois meu caso de uso difere um pouco. Não quero me sentar na frente do meu computador e digite sim / não para todos os aplicativos que instalei. Embora não haja uma maneira real de atualizar os barris (apenas a reinstalação da versão mais recente), primeiro faço a atualização para ter as informações de que existem realmente atualizações disponíveis .

Em seguida, percorro todos os barris para exibir suas informações. Como eu fiz a atualização antes, agora é fornecida uma informação que a versão mais recente de algum barril não está instalada.

Dentro do meu método de atualização, analiso o comando info para essa linha específica:

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

Que se traduz em: "Forneça as 3 linhas acima das informações fornecidas sempre que você ler a linha" não instalada ". Exclua qualquer linha que tenha um link, exclua também uma linha que tenha um ':'."

Dada a estrutura do comando brew cask info, terminamos com uma linha (sem informações da versão, sem URL do aplicativo), que reflete o nome real do barril no qual ele também foi instalado.

saída de informações do barril de fermentação

Na minha versão, essas informações agora são impressas para que você possa ver facilmente quais barris estão desatualizados e que podem ser atualizados.

Neste ponto, eu faço um caso de troca, porque talvez agora não haja tempo suficiente para atualizar as coisas. Depende do seu caso de uso. Para mim, às vezes eu só quero ver o que há de novo (aguardando uma nova versão, uma correção de bug), mas não tenho tempo para atualizar as coisas, porque agora eu não quero fechar meu navegador etc.

Portanto, se alguém optar por "sim", a lista de nomes limpos de barris será fornecida à função de atualização, onde para cada barril que foi determinado como desatualizado, a reinstalação é emitida.

Mais uma vez obrigado a deinspanjer, enquanto tentava resolver esse problema por mim mesmo, sempre esqueci de publicar a atualização com antecedência, para que não houvesse uma linha "não instalada" para analisar (a base de toda a minha abordagem).

Eu espero que isso tenha sido útil.

Kevin N
fonte
2

Eu fiz esse roteiro sozinho. Consulte o github https://github.com/pesh1983/brew_cask_upgrade . Tem uma descrição muito boa, mas se você tiver alguma dúvida adicional, não hesite em me perguntar. Ele faz um upgrade justo: desinstale e instale, para que qualquer limpeza necessária seja realizada pelo próprio 'brew'.

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

obter barris desatualizados:

barril de cerveja desatualizado

barril de atualização:

barril de cerveja reinstalar barril desatualizado

script de demonstração:

$ 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
fonte
2

Verifique barris desatualizados:

barril de cerveja desatualizado

Atualizando todo o barril desatualizado:

atualização de barril de fermentação

Se você deseja atualizar o barril específico, basta adicionar o nome do barril após a atualização (por exemplo: 4k-video-downloader):

atualização do barril de fermentação 4k-video-downloader

Amir Marmul
fonte
2
Olá, seja bem-vindo ao StackOverflow. Como essa é uma pergunta antiga com várias respostas, uma das quais é extremamente popular e aceita, edite sua resposta para fornecer mais detalhes sobre como ela responde à pergunta e por que é preferível às respostas existentes. Obrigado.
MandyShaw
1

Com base no que li, criei um script que criará um arquivo que lista os arquivos a serem atualizados, incluindo aplicativos definidos como os mais recentes. Você pode modificar o arquivo para atender aos seus requisitos e instalar atualizações usando o meu script olinst.

Para mais informações, visite meu github.

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

Paul Cav
fonte
1

eu uso

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