Zaktualizuj wszystkie beczki zainstalowane za pośrednictwem Homebrew Cask

157

Używam Homebrew Cask do instalowania aplikacji na OS X. Jak mogę zaktualizować wszystkie zainstalowane beczki?

enrico.bacis
źródło
3
Dodane pytanie: „jak po prostu ulepszyć jedną z beczek?”
Matthew Harwood
Byłbym tym bardzo zainteresowany ... wydaje się, że nie ma sposobu na ulepszenie beczki, ale nie ma to sensu. Mam zainstalowane Brackets 1.3 i mam zainstalowane wtyczki w nawiasach. Teraz, gdy jest już 1.4, chciałbym zaktualizować, ale zachowaj wtyczki. Nie rozumiem, jak mam to zrobić.
Jean-François Beauchef
Jeśli chodzi w szczególności o nawiasy, rozszerzenia użytkownika w systemie OS X for Brackets są przechowywane w ~/Library/Application Support/Brackets/extensions/useri powinny być zachowywane po uaktualnieniach. Wtyczki systemowe są rzeczywiście przechowywane w pakiecie aplikacji w programie Brackets.app/extensions/defaulti są tracone po wymianie pakietu aplikacji, ale najłatwiejszym sposobem byłoby po prostu skopiowanie wtyczek ze starego pakietu do nowego.
Caleb Xu
FYI: Wdrożeniebrew cask upgrade połączonych 15 zatwierdzeń do Homebrew: master
l --marc l
Jedyny sposób, w jaki znalazłem ulepszenie pojedynczej beczki, to brew cask uninstall my-cool-caskwtedy brew cask install my-cool-cask.
Aaron Grey

Odpowiedzi:

292

Wreszcie pojawił się oficjalny mechanizm aktualizacji Homebrew Cask (zobacz wydanie 3396 dotyczące implementacji)! Aby z niego skorzystać, po prostu uruchom to polecenie:

brew cask upgrade

Nie spowoduje to jednak aktualizacji beczek, które nie mają informacji o wersji ( version :latest) lub aplikacji, które mają wbudowany mechanizm aktualizacji ( auto_updates true). Aby ponownie zainstalować te beczki (i w konsekwencji zaktualizować je, jeśli aktualizacje są dostępne), uruchom polecenie upgrade z --greedyflagą w następujący sposób:

brew cask upgrade --greedy

scribblemaniac
źródło
3
Dzięki @mipadi za skopiowanie mojej odpowiedzi poniżej do tej, nawet bez cytowania lub głosowania. W każdym razie teraz ten wydaje się kompletny.
enrico.bacis
3
@ enrico.bacis: Chill. Nie widziałem Twojej odpowiedzi, a to jest oczywisty dodatek. (I dla porządku, pan powinien był edytowany tę odpowiedź zamiast dodawać nową.)
mipadi
2
To naprawdę mnie irytowało, więc stworzyłem ten skrypt, aby zaktualizować wszystkie aplikacje Brew i pozwolić użytkownikowi wybrać, które aplikacje Cask mają zaktualizować. Możesz również wykluczyć aplikacje z rozważenia. github.com/derrekyoung/ScriptsAndUtils/blob/master/…
Derrek
14
Możesz teraz używać brew cask outdated | xargs brew cask reinstalltylko do ponownej instalacji przestarzałych beczek.
phdoerfler
2
Należy pamiętać, że brew cask outdateddrukuje tylko nazwy aplikacji, które nie mają włączonej funkcji „automatycznej aktualizacji”. Aby zaktualizować WSZYSTKIE przestarzałe aplikacje, użyjbrew cask outdated --greedy --verbose | grep -v '(latest)' | awk '{print $1}' | xargs brew cask reinstall
jmk
48

homebrew-cask-upgrade

Myślę, że to zdecydowanie najlepsze rozwiązanie do ulepszenia beczek.
źródło: https://github.com/buo/homebrew-cask-upgrade

Instalacja i użytkowanie

brew tap buo/cask-upgrade
brew update
brew cu

(Opcjonalnie) Wymuś aktualizację nieaktualnych aplikacji, w tym oznaczonych jako najnowsze:

brew cu --all
Atais
źródło
@XingangHuang yes
ovnia
26

Możliwe jest wylistowanie zainstalowanych beczek z:

brew cask list

I wymuś ponowną instalację beczki za pomocą:

brew cask install --force CASK_NAME

Więc przesyłając wyjście pierwszego polecenia do drugiego, aktualizujemy wszystkie beczki:

brew cask list | xargs brew cask install --force
enrico.bacis
źródło
1
To tak naprawdę nie aktualizuje beczek. Wymusza ponowną instalację, nawet w przypadku beczek, które nie mają dostępnej aktualizacji. W zależności od liczby zainstalowanych beczek i czasu ich zainstalowania, może to spowodować niepotrzebne pobieranie, zająć dużo czasu i poprosić o dostęp do sudo.
Burhan Ali
20

Skrypt Bash do aktualizacji pakietów

zainspirowany odpowiedzią Pascala

#!/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

Co to robi

  • aktualizacja beczki do parzenia / parzenia, czyszczenie
  • przeczytaj listę beczek
  • sprawdź brew cask infonajnowszą wersję
  • zainstaluj nową wersję, jeśli jest dostępna (i usuwa wszystkie stare wersje!)

źródło: https://gist.github.com/atais/9c72e469b1cbec35c7c430ce03de2a6b

jedna wkładka dla niecierpliwych:

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

zapisz jako /usr/local/bin/cask-upgrade , aby można było uruchomić go lokalnie, jak cask-upgradepóźniej

Atais
źródło
Nie możesz po prostu zrobić brew cask info $cask | grep "Not installed"?
Det
@Det hah ... cóż, nie widziałem tego, ale teraz widzę. Cóż, mógłbym to zrobić w następnej wersji ;-)
Atais
1
$ brew cask info $cask | grep "Not installed"podaje błądError: This command requires a Cask token
eduncan911
1
@ eduncan911 używasz go ze skryptem, pofor cask in ${casks[@]}; do
Det
smacks headoczywiście! nie mogę uwierzyć, że tego nie złapałem.
eduncan911
11

Od grudnia 2017 użycie: ulepszenie beczki zaparzającej

[WYCOFANE od grudnia 2017 r., Kiedy Homebrew wprowadził polecenie aktualizacji dla beczki] Po prostu używam następującego:

brew cask outdated | xargs brew cask reinstall

Bojoer
źródło
Zasadniczo to, co ja też robię, z wyjątkiem tego, że pracuję awk '{print $1}'między nimi.
Paul Nelson Baker
6

Oto funkcja, którą napisałem do obsługi tego. Zauważ, że osobiście nie chciałem, aby po prostu na ślepo ponownie instalował wszystko, ponieważ niektóre z beczek, których używam, wymagają trochę czasu, aby zainstalować lub wymagają dodatkowego monitu.

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
źródło
Używam OS X El Capitan, ale kiedy testowałem tę funkcję, miałem powłokę zgłaszającą błędy, ponieważ - nie jest dozwolonym znakiem w nazwach funkcji . Ważna różnica - chociaż działa w bash, jest niedozwolona dla sh, więc jeśli używasz #! / Bin / sh dla kompatybilności między systemami z wieloma powłokami, to nie zadziała. Jednak zmiana łączników na podkreślenia działa dobrze.
Bryan 'BJ' Hoffpauir Jr.
5

Bazując na odpowiedzi @Atais, ulepszyłem jego logikę do czegoś ładniejszego. Chciałem znaleźć sposób na sprawdzenie pakietów, które mają zostać zaktualizowane, przed faktycznym wymuszeniem aktualizacji.

  • $ brew-cask.shpo prostu wyświetla dane wyjściowe podobne do Homebrew brew update.
  • powyższa lista pokazuje wszystkie zainstalowane pakiety, a zielony wskazuje wszelkie oczekujące aktualizacje.
  • $ brew-cask.sh upgrade wymusi aktualizację tych pakietów.

Kod:

# 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

po prostu go zainstaluj (inaczej „Potrzebuję go teraz!”)

Zostało wpisane do mojego .dotfilesrepozytorium ; więc możesz szybko zainstalować go w swoim za ~/binpomocą:

$ 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

Następnie użyj go w ten sposób:

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

Jeśli nie masz ~/binw swojej ścieżce, przedrostek ~/bin/do powyższych instrukcji.

eduncan911
źródło
5

brew cask upgrade

upgradeKomenda została niedawno wprowadzona w Homebrew Beczka i powinien potępiać wszystkich innych metod manualnych opisane w innych odpowiedzi.

enrico.bacis
źródło
Chociaż to polecenie istnieje, tak naprawdę nie aktualizuje wielu pakietów.
Acumenus
4

Myślę, że używając

brew cask reinstall `brew cask outdated`

da rade. Pomoże to również usunąć poprzednie wersje aplikacji i zainstaluje nowszą wersję.

Pranab Agarwal
źródło
2
teraz powinno byćbrew cask reinstall `brew cask outdated`
gbonetti
1
Dzięki za aktualizację @gbonetti. Masz rację. Dzięki nowej opcji „przestarzałe” zadanie staje się łatwiejsze i szybsze :-).
Pranab Agarwal
2

poprawiając dostarczony kod z deinspanjer, próbowałem naśladować polecenie noop, podobnie jak to z chocolatey ( aktualizacja choco --noop / choco nieaktualne ).

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

Jak widać, używam podejścia modułowego, ponieważ mój przypadek użycia trochę się różni. Nie chcę siedzieć przed komputerem i wpisywać tak / nie dla każdej zainstalowanej aplikacji. Chociaż nie ma prawdziwego sposobu na aktualizację beczek (wystarczy przeinstalować najnowszą wersję), najpierw wykonuję aktualizację parzenia, aby mieć informacje, że faktycznie są dostępne aktualizacje .

Następnie przechodzę przez wszystkie beczki, aby wyświetlić ich informacje. Ponieważ wcześniej przygotowałem aktualizację, teraz pojawia się informacja, że ​​najnowsza wersja niektórych beczek nie jest zainstalowana.

W ramach mojej metody aktualizacji faktycznie analizuję polecenie info dla tej konkretnej linii:

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

Co przekłada się na: „Podaj 3 linie powyżej informacji podanych za każdym razem, gdy przeczytasz wiersz„ nie zainstalowano ”. Następnie usuń każdą linię, która ma w niej łącze, usuń również linię, w której znajduje się znak ':'."

Biorąc pod uwagę strukturę polecenia brew cask info, otrzymujemy jedną linię (bez informacji o wersji, bez adresu URL aplikacji), która odzwierciedla rzeczywistą nazwę beczki, z którą również została zainstalowana.

wyjście informacji o zaparzeniu beczki

W mojej wersji te informacje są teraz drukowane, dzięki czemu można łatwo zobaczyć, które beczki są nieaktualne i można je zaktualizować.

W tym momencie robię przypadek przełącznika, ponieważ może teraz nie ma wystarczająco dużo czasu na aktualizację. To zależy od twojego przypadku użycia. Dla mnie czasami po prostu chcę zobaczyć, co nowego (czekanie na nową wersję, naprawę błędu), ale tak naprawdę nie mam czasu na aktualizację, ponieważ w tej chwili nie chcę zamykać przeglądarki itp.

Więc jeśli ktoś zdecyduje się na „tak”, lista wyczyszczonych nazw beczek jest przekazywana do funkcji aktualizacji, gdzie dla każdej beczki, która została uznana za nieaktualną, jest wydawana ponowna instalacja.

Jeszcze raz dziękuję deinspanjerowi, próbując samemu rozwiązać ten problem, zawsze zapominałem o wcześniejszym wydaniu aktualizacji naparu, więc nie było tam „niezainstalowanej” linii do przetworzenia (podstawa mojego podejścia).

Mam nadzieję, że to było pomocne.

Kevin N
źródło
2

Sam napisałem taki scenariusz. Proszę spojrzeć na github https://github.com/pesh1983/brew_cask_upgrade . Ma całkiem niezły opis, ale jeśli masz dodatkowe pytania, zapraszam do mnie. Dokonuje uczciwej aktualizacji: odinstaluj i zainstaluj, więc wszelkie niezbędne czyszczenie zostanie wykonane przez samego „brew”.

Pavel Goltsev
źródło
2
brew cask outdated | xargs brew cask reinstall --force
Omar Albeik
źródło
2

zdobądź przestarzałe beczki:

beczka do parzenia przeterminowana

upgrade cask:

zaparz beczkę ponownie zainstaluj przestarzałą beczkę

skrypt demonstracyjny:

$ 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
źródło
1

Na podstawie tego, co przeczytałem, stworzyłem skrypt, który utworzy plik zawierający listę plików do aktualizacji, w tym aplikacje zdefiniowane jako najnowsze. Następnie możesz zmodyfikować plik, aby dopasować go do swoich wymagań i zainstalować aktualizacje za pomocą mojego skryptu olinst.

Aby uzyskać więcej informacji, odwiedź mój github.

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

Paul Cav
źródło
1

używam

brew cask install --force `brew cask list`
goksel
źródło
1

Sprawdź przestarzałe beczki:

beczka do parzenia przeterminowana

Aktualizacja wszystkich przestarzałych beczek:

Warz ulepszenie beczki

Jeśli chcesz zaktualizować konkretną beczkę, po prostu dodaj nazwę beczki po aktualizacji (np. 4k-video-downloader):

brew cask upgrade 4k-video-downloader

Amir Marmul
źródło
2
Cześć, witaj w StackOverflow. Biorąc pod uwagę, że jest to stare pytanie z wieloma odpowiedziami, z których jedno jest niezwykle popularne i akceptowane, edytuj swoją odpowiedź, aby podać więcej szczegółów, w jaki sposób odpowiada na pytanie i dlaczego jest lepsza od istniejących odpowiedzi. Dzięki.
MandyShaw