Оновіть усі скриньки, встановлені за допомогою Homebrew Cask


157

Я використовую Homebrew Cask для встановлення програм на OS X. Як оновити всі встановлені скриньки?


3
Питання, що додається: "як би я просто оновив одну із скриньок?"
Меттью Харвуд

Мене б дуже зацікавило це ... начебто не існує способу оновити скриньку, але це не має сенсу. У мене встановлено Кронштейни 1.3, і я встановив плагіни всередині дужок. Тепер, коли 1.4 вийшов, я хотів би оновити, але зберігати плагіни. Я не бачу, як мені це робити.
Жан-Франсуа Бошоф

Що стосується конкретно брекетів, розширення для користувачів на ОС X для брекетів зберігаються ~/Library/Application Support/Brackets/extensions/user, і вони повинні зберігатися протягом оновлень. Системні плагіни дійсно зберігаються в пакеті програми Brackets.app/extensions/default, і вони втрачаються, коли ви замінюєте пакет додатків, але найпростішим способом було б просто скопіювати плагіни зі старого пакета на новий.
Калеб Сю


Єдиний спосіб я знайшов оновити одну скриньку - це brew cask uninstall my-cool-caskтоді brew cask install my-cool-cask.
Аарон Грей

Відповіді:


292

Зараз нарешті існує офіційний механізм оновлення Casbre Homebrew ( для впровадження див. Випуск 3396 )! Для його використання просто запустіть цю команду:

brew cask upgrade

Однак це не буде оновлювати скриньки, які не мають інформації про версії ( version :latest), або програми, що мають вбудований механізм оновлення ( auto_updates true). Щоб перевстановити ці скриньки (і, отже, оновити їх, якщо є оновлення), запустіть команду оновлення з таким --greedyпрапором:

brew cask upgrade --greedy


3
Дякую @mipadi, що скопіював мою відповідь нижче в цю, навіть не посилаючись на це або не звертаючись до неї. У будь-якому разі зараз ця здається завершеною.
enrico.bacis

3
@ enrico.bacis: Застуда. Я не бачив вашої відповіді, і це очевидне доповнення. (І для запису, ви повинні відредагувати цю відповідь, а не додавати нову.)
mipadi

2
Це мене справді роздратувало, тому я створив цей сценарій, щоб оновити всі програми Brew і дозволити користувачеві вибирати, які програми Cask оновлювати. Ви також можете виключити додатки з розгляду. github.com/derrekyoung/ScriptsAndUtils/blob/master/…
Деррек

14
Тепер ви можете використовувати brew cask outdated | xargs brew cask reinstallлише для встановлення застарілих скриньок.
phdoerfler

2
Важливо зауважити, що brew cask outdatedдрукуються лише імена програм, у яких не ввімкнено автоматичне оновлення. Щоб оновити ВСІ додатки, які застаріли, використовуйтеbrew cask outdated --greedy --verbose | grep -v '(latest)' | awk '{print $1}' | xargs brew cask reinstall
jmk

48

homebrew-cask-оновлення

Я думаю, що це далеко не найкраще рішення для оновлення бочок.
джерело: https://github.com/buo/homebrew-cask-upgrade

Встановлення та використання

brew tap buo/cask-upgrade
brew update
brew cu

(Необов’язково) Примушуйте оновити застарілі програми, включаючи найновіші:

brew cu --all

@XingangHuang та
ovnia

26

Можна встановити список встановлених бочок за допомогою:

brew cask list

І змусити перевстановити скриньку за допомогою:

brew cask install --force CASK_NAME

Отже, перетворюючи вихід першої команди в другу, ми оновлюємо всі бочки:

brew cask list | xargs brew cask install --force

1
Це насправді не оновлює бочки. Це змушує перевстановлення навіть для скриньок, які не мають оновлення. Залежно від кількості встановлених скриньок і як довго вони були встановлені, це може спричинити непотрібні завантаження, зайняти багато часу та підкаже про доступ до sudo.
Бурхан Алі

20

Сценарій Bash для оновлення пакетів

натхненний відповіддю Паскаля

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

Що це робить

  • оновити заварку / варити бочковий засіб, очистити
  • читати список бочок
  • перевірте наявність brew cask infoновітньої версії
  • встановіть нову версію, якщо вона доступна (і видаляє всі старі версії!)

джерело: https://gist.github.com/atais/9c72e469b1cbec35c7c430ce03de2a6b

один лайнер для нетерплячих:

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

зберегти як /usr/local/bin/cask-upgrade , щоб ви могли запустити його локально, як cask-upgradeпізніше


Ви не можете просто зробити brew cask info $cask | grep "Not installed"?
Дет

@Det hah ... ну я цього не бачив, але зараз роблю. Що ж, я можу зробити це в наступній версії ;-)
Atais

1
$ brew cask info $cask | grep "Not installed"дає помилкуError: This command requires a Cask token
eduncan911

1
@ eduncan911 ви використовуєте його зі сценарієм, післяfor cask in ${casks[@]}; do
Det

smacks headочевидно! не можу повірити, що я цього не спіймав.
eduncan911

11

Станом на грудень 2017 року використовуйте: оновлення квасочки

[ВИДАЛЕНО з грудня 2017 року, коли Homebrew представив команду оновлення для cask], я просто використовую наступне:

brew cask outdated | xargs brew cask reinstall


В основному те, що я теж роблю, за винятком того, що я проводжу awk '{print $1}'між ними.
Пол Нельсон Бейкер

6

Ось функція, яку я написав для цього. Зауважте, що я особисто не хотів, щоб він просто сліпо перевстановив усе, оскільки деякі скриньки, які я використовую, потребують певного часу, щоб встановити або вимагати додаткових запитів.

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 
} 

Я запускаю OS X El Capitan, але коли я тестував цю функцію, у мене в оболонці виникали помилки, оскільки - не дозволений символ у назвах функцій . Важлива відмінність - хоча це працює в bash, це заборонено для sh, тому якщо ви використовуєте #! / Bin / sh для сумісності між системами з декількома оболонками, це не працює. Хоча зміна дефісів на підкреслення добре працює.
Брайан 'BJ' Hoffpauir Jr.

5

На основі відповіді @Atais я перетворив його логіку на щось приємніше. Я хотів, щоб спочатку перевірити пакунки до оновлених, перш ніж насправді примусити оновлення.

  • $ brew-cask.shпросто перелічує вихід, подібний до домашнього brew update.
  • у наведеному вище списку відображаються всі встановлені пакети, зеленим кольором із зазначенням будь-яких оновлених оновлень.
  • $ brew-cask.sh upgrade змусить оновити ці пакети.

Код:

# 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

просто встановіть його (він же мені зараз потрібен!)

Це перевірено в моєму .dotfilesрепо ; Отже, ви можете швидко встановити його у свій ~/bin:

$ 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

Потім використовуйте його так:

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

Якщо у вас немає ~/binшляху, приставку ~/bin/до вищевказаних тверджень.


5

brew cask upgrade

upgradeКоманда недавно була введена в Homebrew Бочонок і повинні принизити всі інші ручні методи , описані в інших відповідях.


Хоча ця команда існує, вона дійсно не оновлює кількість пакетів.
Acumenus

4

Я думаю, використовуючи

brew cask reinstall `brew cask outdated`

зробить трюк. Це також допоможе видалити попередню версію / програми та встановить нову версію.


2
тепер це має бутиbrew cask reinstall `brew cask outdated`
gbonetti

1
Дякуємо за оновлення @gbonetti. Ви праві. З новим "застарілим" варіантом завдання стає простішим і швидшим :-).
Пранаб Агарвал

2

вдосконалюючи наданий код від deinspanjer, я намагався імітувати команду noop, подібно до тієї з шоколаду ( оновлення choco --noop / choco застаріло ).

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

Як видно, я використовую модульний підхід, оскільки мій випадок використання дещо відрізняється. Я не хочу сидіти перед своїм комп’ютером і вводити так / ні для кожного встановленого додатка. Хоча реального способу оновлення скриньок немає (просто перевстановіть найновішу версію), я спочатку роблю оновлення, щоб мати інформацію про наявність актуальних оновлень .

Далі я перебираю всі бочки, щоб відобразити їх інформацію. Оскільки я попередньо готував оновлення, тепер надається інформація про те, що остання версія деякої скриньки не встановлена.

Всередині мого методу оновлення я фактично аналізую команду info для цього конкретного рядка:

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

Що означає: "Наведіть 3 рядки вище інформації, наданої щоразу, коли ви читаєте рядок" не встановлено ". Потім видаліть будь-який рядок, у якому є посилання, а також видаліть рядок, у якому": "."

Враховуючи структуру команди запікання інформації про заварку, ми закінчуємо один рядок (інформація про версію, URL-адреса програми), яка відображає фактичну назву скриньки, з якою вона також була встановлена.

заварювати інформацію про вивірку

У моїй версії ця інформація тепер роздруковується, так що можна легко побачити, які скриньки застаріли та чи могли бути оновлені.

На даний момент я роблю вимикач, тому що, можливо, зараз недостатньо часу для оновлення речей. Це залежить від Вашого випадку використання. Для мене я іноді просто хочу побачити, що нового (чекає нової версії, помилка), але насправді не встигаю оновлювати речі, тому що зараз я не хочу закривати свій браузер тощо.

Отже, якщо хтось обрав "так", список очищених назв скриньок надається функції оновлення, де для кожної скриньки, яка була визначена застарілою, видано перевстановлення.

Ще раз дякую deinspanjer, намагаючись вирішити цю проблему для себе, я завжди забував заздалегідь випустити оновлення пива, щоб там не було рядка "не встановлено", щоб насправді проаналізувати (основа мого цілого підходу).

Я сподіваюся, що це було корисно.


2

Такий сценарій я створив сам. Погляньте на https://github.com/pesh1983/brew_cask_upgrade . Він має досить хороший опис, але якщо у вас є додаткові запитання, не соромтеся запитати мене. Це справедливе оновлення: видаліть та встановіть, тому будь-яке необхідне очищення виконуватиме сам «варити».



2

отримати застарілі бочки:

пивоварна бочка застаріла

оновлення скриньки:

перевстановити заварену бочкову скриньку

демонстраційний сценарій:

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

1

На основі того, що я прочитав, я створив сценарій, який створить файл, у якому перераховані файли для оновлення, включаючи додатки, визначені як останні. Потім ви можете змінити файл відповідно до ваших вимог та встановити оновлення, використовуючи мій сценарій olinst.

Для отримання додаткової інформації відвідайте мій github.

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




1

Перевірте застарілі скриньки:

пивоварна бочка застаріла

Оновлення застарілої скриньки:

оновлення квасочки

Якщо ви хочете оновити специфічний скриньку, просто додайте ім'я cask після оновлення (наприклад: 4k-video-downloader):

brew cask upgrade 4k-video-downloader


2
Привіт, Ласкаво просимо до StackOverflow. Зважаючи на те, що це старе запитання з декількома відповідями, один з яких є надзвичайно популярним і прийнятим, будь ласка, відредагуйте свою відповідь, щоб отримати детальнішу інформацію про те, як вона відповідає на питання і чому вона є кращою для існуючих відповідей. Дякую.
MandyShaw
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.