Обновите все бочки, установленные через Homebrew Cask

159

Я использую Homebrew Cask для установки приложений на OS X. Как обновить все установленные бочки?

enrico.bacis
источник
3
Прикрепленный вопрос: «Как бы мне просто обновить одну из бочек?»
Мэтью Харвуд,
Я был бы очень заинтересован в этом ... Кажется, нет никакого способа обновить бочку, но это не имеет смысла. У меня установлены Брекеты 1.3, и я установил плагины внутри скоб. Теперь, когда вышла 1.4, я бы хотел обновить ее, но оставлю плагины. Я не понимаю, как я должен это сделать.
Жан-Франсуа Бошеф
Что касается Brackets, в частности, пользовательские расширения в OS X для Brackets хранятся в них ~/Library/Application Support/Brackets/extensions/user, и они должны сохраняться при всех обновлениях. Системные плагины действительно хранятся в комплекте приложений Brackets.app/extensions/default, и они теряются при замене комплекта приложений, но самый простой способ - просто скопировать плагины из старого комплекта в новый.
Калеб Сюй
К вашему сведению: внедритьbrew cask upgrade объединенные 15 коммитов в Homebrew: master
l --marc l
Единственный способ, который я нашел, чтобы обновить одну бочку - это brew cask uninstall my-cool-caskпотом brew cask install my-cool-cask.
Аарон Грей

Ответы:

295

Наконец-то появился официальный механизм обновления для Homebrew Cask (см. Раздел «Выпуск 3396» )! Чтобы использовать его, просто запустите эту команду:

brew cask upgrade

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

brew cask upgrade --greedy

scribblemaniac
источник
3
Спасибо @mipadi за то, что скопировали мой ответ ниже в этот, даже не цитируя и не голосуя. Во всяком случае, теперь этот кажется полным.
enrico.bacis
3
@ enrico.bacis: Холод. Я не видел вашего ответа, и это очевидное дополнение. (И для
справки
2
Это действительно раздражало меня, поэтому я создал этот скрипт, чтобы обновить все приложения Brew и позволить пользователю выбирать, какие приложения Cask обновлять. Вы также можете исключить приложения из рассмотрения. github.com/derrekyoung/ScriptsAndUtils/blob/master/…
Derrek
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

доморощенная-бочка-обновление

Я думаю, что это лучшее решение для модернизации бочек.
источник: https://github.com/buo/homebrew-cask-upgrade

Установка и использование

brew tap buo/cask-upgrade
brew update
brew cu

(Необязательно) Принудительное обновление устаревших приложений, в том числе отмеченных как последние:

brew cu --all
Atais
источник
@XingangHuang да
Овня
26

Список установленных бочек можно перечислить с помощью:

brew cask list

И принудительно переустановите бочку с помощью:

brew cask install --force CASK_NAME

Таким образом, передавая вывод первой команды во вторую, мы обновляем все бочки:

brew cask list | xargs brew cask install --force
enrico.bacis
источник
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позже

Atais
источник
Вы не можете просто сделать brew cask info $cask | grep "Not installed"?
Det
@ Dет ха-ха ... ну, я не видел, но я сейчас вижу. Ну, я мог бы сделать это в следующей версии ;-)
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 ввел команду обновления для бочки]. Я просто использую следующее:

brew cask outdated | xargs brew cask reinstall

Bojoer
источник
В основном то, что я делаю тоже, за исключением того, что я перебираю 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 
} 
deinspanjer
источник
Я использую OS X El Capitan, но когда я тестировал эту функцию, у меня была ошибка, вызывающая оболочку, потому что - не разрешенный символ в именах функций . Важное отличие - хотя он работает в bash, он не разрешен для sh, поэтому, если вы используете #! / Bin / sh для совместимости между системами с несколькими оболочками, это не сработает. Хотя замена дефисов на подчеркивания работает нормально.
Брайан 'BJ' Хоффпауир младший
5

Основываясь на ответе @Atais, я усовершенствовал его логику во что-то более приятное. Мне нужен был способ проверить пакеты, которые нужно обновить, прежде чем приступать к принудительному обновлению.

  • $ brew-cask.sh просто перечисляет вывод, похожий на Homebrew's 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/к приведенным выше утверждениям.

eduncan911
источник
5

brew cask upgrade

Эта upgradeкоманда была недавно введена в Homebrew Cask и должна исключать все другие ручные методы, описанные в других ответах.

enrico.bacis
источник
Хотя эта команда существует, она действительно не обновляет ряд пакетов.
Acumenus
4

Я думаю, используя

brew cask reinstall `brew cask outdated`

сделает свое дело. Это также поможет удалить предыдущую версию (и) приложения и установит более новую версию.

Пранаб Агарвал
источник
2
теперь это должно бытьbrew cask reinstall `brew cask outdated`
gbonetti
1
Спасибо за обновление @gbonetti. Ты прав. С новой «устаревшей» опцией задача становится проще и быстрее :-).
Пранаб Агарвал
2

улучшая предоставленный код от deinspanjer, я попытался имитировать команду noop, очень похожую на команду из chocolatey ( обновление 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

Как видите, я использую модульный подход, поскольку мой вариант использования немного отличается. Я не хочу сидеть перед моим компьютером и вводить да / нет для каждого приложения, которое я установил. Хотя нет реального способа обновления бочек (просто переустановите последнюю версию), я сначала делаю brew update, чтобы получить информацию о том, что обновления действительно доступны .

Затем я перебираю все бочки, чтобы отобразить их информацию. Поскольку раньше я делал brew update, теперь одному предоставляется информация о том, что последняя версия некоторых бочек не установлена.

Внутри моего метода обновления я фактически анализирую команду info для этой конкретной строки:

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

Что означает: «Дайте 3 строки выше информации, предоставленной всякий раз, когда вы читаете строку« не установлено ». Затем удалите любую строку, содержащую ссылку в ней, а также удалите строку, содержащую«: »в ней».

Учитывая структуру команды brew cask info, мы получаем одну строку (без информации о версии, без URL-адреса приложения), которая отражает фактическое имя контейнера, с которым оно также было установлено.

вывод информации о бочке

В моей версии эта информация теперь распечатана, поэтому можно легко увидеть, какие бочки устарели и могут быть обновлены.

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

Поэтому, если выбрано «да», список очищенных имен контейнеров передается в функцию обновления, где для каждого контейнера, который был определен как устаревший, выдается переустановка.

Еще раз спасибо deinspanjer, пытаясь решить эту проблему для себя, я всегда забывал заранее выпускать обновление brew, так что там не было строки «не установлено», чтобы фактически разобрать (основа всего моего подхода).

Я надеюсь, что это было полезно.

Кевин Н
источник
2

Я сделал такой скрипт сам. Пожалуйста, посмотрите на github https://github.com/pesh1983/brew_cask_upgrade . У него довольно хорошее описание, но если у вас есть дополнительные вопросы, не стесняйтесь их задавать. Обновление справедливо: удалите и установите, поэтому любая необходимая очистка будет выполняться самим brew.

Павел Гольцев
источник
2
brew cask outdated | xargs brew cask reinstall --force
Омар Альбейк
источник
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}"
Ваньмин Чжан
источник
2

Проверьте устаревшие бочки:

варево бочка устарела

Обновление всех устаревших бочек:

заваривать бочку

Если вы хотите обновить конкретную бочку, просто добавьте имя бочки после обновления (например: 4k-video-downloader):

Brew Cask Обновление 4k-видео-загрузчик

Амир Мармул
источник
2
Привет, добро пожаловать в StackOverflow. Учитывая, что это старый вопрос с несколькими ответами, один из которых является чрезвычайно популярным и приемлемым, отредактируйте свой ответ, чтобы дать более подробную информацию о том, как он отвечает на вопрос и почему он предпочтительнее существующих ответов. Спасибо.
MandyShaw
1

Основываясь на том, что я прочитал, я создал скрипт, который создаст файл со списком файлов, которые будут обновлены, включая приложения, которые определены как последние. Затем вы можете изменить файл в соответствии с вашими требованиями и установить обновления, используя мой скрипт olinst.

Для получения дополнительной информации посетите мой GitHub.

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

Пол Кав
источник
1

Это действительно раздражало меня, поэтому я создал этот скрипт, чтобы обновить все приложения Brew и позволить пользователю выбирать, какие приложения Cask обновлять. Вы также можете исключить приложения из рассмотрения.

https://github.com/derrekyoung/ScriptsAndUtils/blob/master/brew-cask-upgrade.sh

Деррек
источник
1

я использую

brew cask install --force `brew cask list`
Goksel
источник