Обновление всех установленных контейнеров через доморощенного бочонок


Я использую Бочонок Домашнего Пива для установки приложений на OS X. Как обновить все установленные бочки?

16 117

16 ответов:

Декабрь 2017 Обновление

Я думал, что этого никогда не произойдет, но теперь, наконец, появился официальный механизм обновления для Homebrew Cask (см. вопрос 3396 для реализации)! Чтобы использовать его, просто выполните следующую команду:

brew cask upgrade

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

brew cask upgrade --greedy

обновление марта 2017 года (помните каламбур ;) (@polo)

Я нашел некоторые обновления, так как это было изначально ответил. Для решения этой проблемы теперь можно использовать brew cask reinstall:

brew cask reinstall <cask_name>
brew cask list | xargs brew cask reinstall

проблема 4678, упомянутая в исходном ответе, была закрыта, и функция обновления теперь обсуждается в вопрос #29301 Есть также buo / homebrew-cask-upgrade, внешний пакет, который добавляет команду обновления для brew cask. Я успешно протестировал его на нескольких пакетах.

Оригинальный Ответ

нет никакого официального метода для модернизации доморощенных бочек. В настоящее время над этим ведется работа, но она еще очень далека от завершения. Смотрите вопрос #4678 для более подробной информации. Эта проблема также имеет некоторые примеры сценариев, которые пользователи используйте для обновления всех своих бочек. Самый простой способ обновить один бочку - запустить brew cask install --force <cask_name>, но просто знайте, что есть шанс, что это может вызвать проблемы с вашим приложением, так как он не будет правильно удален в первую очередь. Обычно это не проблема, хотя.

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

brew cask list | xargs brew cask install --force

на будущее, более подробную информацию можно найти в дублировать вопрос на github.

homebrew-cask-upgrade

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

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

brew tap buo/cask-upgrade
brew update
brew cu

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

brew cu --all

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

brew cask list

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

brew cask install --force CASK_NAME

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

brew cask list | xargs brew cask install --force

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:\ \(.*\)//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 позже

по состоянию на декабрь 2017 года использовать: brew cask upgrade

[устарел с декабря 2017 года, когда Homebrew представил команду обновления для cask] Я просто использую следующее:

brew cask outdated | xargs brew cask reinstall

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

brew-cask-upgrade() { 
  if [ "" != '--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 
} 

основываясь на ответе @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 [[ "" == "upgrade" ]]; then
  for cask in ${casks[@]}; do
    current="$(brew cask info $cask | sed -n '1p' | sed -n 's/^.*: \(.*\)$//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/^.*: \(.*\)$//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/ к приведенным выше утверждениям.

Я думаю, что с помощью

brew cask reinstall `brew cask outdated`

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

brew cask upgrade

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

улучшение предоставленного кода от 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

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

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

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

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

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

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

brew cask info output

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

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

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

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

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

brew cask outdated | xargs brew cask reinstall --force

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

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

обновить бочковой:

brew cask переустановить устаревший-cask

демо-скрипт:

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

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

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

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

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

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

Я использую

brew cask install --force `brew cask list`