อัพเกรดถังทั้งหมดที่ติดตั้งผ่าน Homebrew Cask


159

ฉันใช้Homebrew Caskเพื่อติดตั้งแอปพลิเคชันบน OS X ฉันจะอัปเกรด casks ที่ติดตั้งทั้งหมดได้อย่างไร


3
คำถามต่อท้าย: "ฉันจะอัพเกรดถังหนึ่งได้อย่างไร"
Matthew Harwood

ฉันจะสนใจอย่างมากว่า ... ดูเหมือนจะไม่มีทางที่จะอัพเกรดถัง แต่มันก็ไม่สมเหตุสมผล ฉันติดตั้ง Brackets 1.3 และติดตั้งปลั๊กอินไว้ในวงเล็บ ตอนนี้ 1.4 หมดแล้วฉันต้องการอัปเกรด แต่เก็บปลั๊กอินไว้ ผมไม่เห็นว่าฉันควรจะทำอย่างนั้น
Jean-François Beauchef

เกี่ยวกับวงเล็บโดยเฉพาะส่วนขยายของผู้ใช้บน OS X สำหรับวงเล็บจะถูกเก็บไว้~/Library/Application Support/Brackets/extensions/userและสิ่งเหล่านี้ควรคงอยู่ตลอดการอัพเกรด ปลั๊กอินระบบจะถูกเก็บไว้ภายในชุดแอพBrackets.app/extensions/defaultและจะหายไปเมื่อคุณแทนที่กลุ่มแอป แต่วิธีที่ง่ายที่สุดคือการคัดลอกปลั๊กอินจากชุดรวมเก่าไปยังชุดใหม่
คาเลบ Xu

FYI: ดำเนินการbrew cask upgradeรวม 15 กระทำลงไปใน Homebrew: ต้นแบบ
L --marc ลิตร

วิธีเดียวที่ฉันได้พบในการอัพเกรดถังเดียวคือการแล้วbrew cask uninstall my-cool-cask brew cask install my-cool-cask
Aaron Gray

คำตอบ:


294

ในที่สุดก็มีกลไกการอัพเกรดอย่างเป็นทางการสำหรับ Homebrew Cask (ดูฉบับที่ 3396สำหรับการใช้งาน)! หากต้องการใช้งานให้เรียกใช้คำสั่งนี้:

brew cask upgrade

อย่างไรก็ตามสิ่งนี้จะไม่อัปเดตถังที่ไม่มีข้อมูลการกำหนดรุ่น ( version :latest) หรือแอปพลิเคชันที่มีกลไกการอัพเกรดในตัว ( auto_updates true) ในการติดตั้งถังเหล่านี้ใหม่ (และอัพเกรดตามลำดับหากมีการอัพเกรด) ให้เรียกใช้คำสั่งอัพเกรดด้วย--greedyค่าสถานะดังนี้:

brew cask upgrade --greedy


3
@mipadi ขอขอบคุณสำหรับการคัดลอกคำตอบของฉันด้านล่างลงในนี้โดยไม่ได้อ้างถึงหรือ upvoting อย่างไรก็ตามตอนนี้อันนี้ดูเหมือนจะเสร็จสมบูรณ์
enrico.bacis

3
@ enrico.bacis: ชิลล์ ฉันไม่เห็นคำตอบของคุณและนี่คือนอกจากที่เห็นได้ชัด (และสำหรับบันทึกที่คุณควรจะได้แก้ไขคำตอบนี้แทนการเพิ่มใหม่.)
mipadi

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

homebrew-ถังอัพเกรด

ฉันคิดว่านี่เป็นทางออกที่ดีที่สุดในการอัพเกรดถัง
แหล่งที่มา: 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
Burhan Ali

20

Bash script เพื่ออัพเกรดแพ็คเกจ

แรงบันดาลใจจากคำตอบ 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

มันทำอะไร

  • ปรับปรุงชง / ถังเบียร์, การทำความสะอาด
  • อ่านรายการถัง
  • ตรวจสอบ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
เดช

smacks headเห็นได้ชัด! ไม่อยากเชื่อเลยว่าฉันจะไม่เข้าใจ
eduncan911

11

ข้อมูล ณ เดือนธันวาคม 2560 ใช้: อัพเกรดถังบรรจุ

[เลิกใช้ตั้งแต่ธันวาคม 2017 เมื่อ Homebrew แนะนำคำสั่งอัปเกรดสำหรับถัง] ฉันใช้สิ่งต่อไปนี้:

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 แต่เมื่อผมทดสอบฟังก์ชั่นนี้ผมมีเปลือกขว้างปาขึ้นข้อผิดพลาดเพราะ - ไม่ได้เป็นตัวละครที่ได้รับอนุญาตในชื่อฟังก์ชั่น ความแตกต่างที่สำคัญ - แม้ว่ามันจะทำงานในทุบตีมันไม่ได้รับอนุญาตให้ดวลจุดโทษดังนั้นหากคุณใช้ #! / bin / sh เพื่อความเข้ากันได้กับระบบที่มีเชลล์หลายตัวซึ่งจะไม่ทำงาน แม้ว่าการเปลี่ยนขีดกลางเป็นขีดล่างนั้นใช้ได้ดี
Bryan 'BJ' Hoffpauir Jr.

5

จากคำตอบของ @Atais ฉันได้ปรับปรุงตรรกะของเขาเป็นสิ่งที่ดีกว่า ฉันต้องการวิธีตรวจสอบแพ็คเกจเพื่ออัปเกรดก่อนจริง ๆ แล้วบังคับให้อัปเกรด

  • $ brew-cask.shรายการเพียงแค่ออกคล้ายกับ brew updateHomebrew
  • รายการด้านบนแสดงแพ็คเกจทั้งหมดที่ติดตั้งโดยมีสีเขียวแสดงว่ามีการอัปเดตใด ๆ ที่ค้างอยู่
  • $ 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

เพิ่งติดตั้ง (aka "ฉันต้องการมันตอนนี้!")

มันถูกตรวจสอบในrepo ของฉัน.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 ถังและควรเลิกใช้ทุกวิธีการอื่น ๆ คู่มือที่อธิบายไว้ในคำตอบอื่น ๆ


แม้ว่าคำสั่งนี้จะมีอยู่จริง แต่ก็ไม่ได้อัพเกรดแพ็คเกจจำนวนมาก
คิวเมนตัส

4

ฉันคิดว่าใช้

brew cask reinstall `brew cask outdated`

จะทำเคล็ดลับ นี่จะช่วยลบเวอร์ชัน / แอปพลิเคชันก่อนหน้าของแอปพลิเคชันและจะติดตั้งเวอร์ชันที่ใหม่กว่า


2
ตอนนี้ควรเป็นbrew cask reinstall `brew cask outdated`
gbonetti

1
ขอบคุณสำหรับการอัพเดต @gbonetti คุณถูก. ด้วยตัวเลือก "ล้าสมัย" ใหม่งานจะง่ายขึ้นและเร็วขึ้นเช่นกัน :-)
Pranab Agarwal

2

การปรับปรุงรหัสที่ได้รับจากdeinspanjerฉันพยายามเลียนแบบคำสั่ง noop คล้ายกับรหัสช็อคโกแลต ( choco update --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

อย่างที่เห็นฉันกำลังใช้วิธีการแบบแยกส่วนเนื่องจากกรณีการใช้ของฉันแตกต่างกันเล็กน้อย ฉันไม่ต้องการนั่งหน้าคอมพิวเตอร์และพิมพ์ใช่ / ไม่ใช่สำหรับทุกแอพที่ฉันติดตั้ง ในขณะที่ไม่มีทางจริงของถังอัพเกรด (เพียงแค่ติดตั้งรุ่นใหม่ล่าสุด) ผมครั้งแรกที่จะ update ชงจะมีข้อมูลว่ามีจริงจะอัปเดตพร้อมใช้งาน

ต่อไปฉันวนรอบถังทั้งหมดเพื่อแสดงข้อมูล เนื่องจากฉันได้ทำการอัพเดทก่อนหน้านี้ตอนนี้มีข้อมูลหนึ่งที่ไม่ได้ติดตั้งเวอร์ชันล่าสุดของ cask บางตัว

ในวิธีการอัพเดตของฉันฉันจะแยกวิเคราะห์คำสั่งข้อมูลสำหรับบรรทัดเฉพาะนั้น:

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

ตัวแปลใดที่ให้: "ให้ข้อมูลด้านบน 3 บรรทัดที่ให้ไว้เมื่อใดก็ตามที่คุณอ่านบรรทัด" ไม่ได้ติดตั้ง "จากนั้นลบบรรทัดใด ๆ ที่มีลิงก์อยู่

เมื่อพิจารณาถึงโครงสร้างของคำสั่ง brew cask info เราจะจบลงด้วยหนึ่งบรรทัด (ไม่มีข้อมูลเวอร์ชันไม่มี URL ของแอพ) ซึ่งสะท้อนถึงชื่อจริงของ cask ที่ติดตั้งไว้ด้วย

ชงการส่งออกข้อมูลถัง

ในรุ่นของฉันข้อมูลนี้จะถูกพิมพ์ออกมาในขณะนี้เพื่อให้หนึ่งสามารถดูว่าถังที่ล้าสมัยและสามารถปรับปรุงได้

ณ จุดนี้ฉันทำกรณีสวิตช์เพราะบางทีตอนนี้ไม่ได้มีเวลาเพียงพอที่จะอัปเดตสิ่งต่าง ๆ ขึ้นอยู่กับการใช้งานของคุณ สำหรับฉันบางครั้งฉันต้องการเห็นว่ามีอะไรใหม่ (กำลังรอรุ่นใหม่เป็นตัวแก้ไขข้อผิดพลาด) แต่ไม่มีเวลาอัปเดตสิ่งต่าง ๆ เพราะตอนนี้ฉันไม่ต้องการปิดเบราว์เซอร์ของฉันเป็นต้น

ดังนั้นหากหนึ่ง opts สำหรับ "ใช่" รายการของชื่อถังที่ทำความสะอาดจะถูกกำหนดให้กับฟังก์ชั่นการอัพเดทซึ่งสำหรับแต่ละถังที่ถูกกำหนดให้ล้าสมัยจะมีการติดตั้งใหม่

ขอขอบคุณอีกครั้งที่ deinspanjer ในขณะที่พยายามแก้ไขปัญหานี้ด้วยตัวเองฉันลืมที่จะออกการปรับปรุงชงไว้ล่วงหน้าดังนั้นจึงไม่มีบรรทัด "ไม่ได้ติดตั้ง" เพื่อแยกวิเคราะห์ (รากฐานของวิธีการทั้งหมดของฉัน)

ฉันหวังว่านี่จะเป็นประโยชน์


2

ฉันทำสคริปต์ด้วยตัวเอง โปรดดูที่ GitHub 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}"

2

ตรวจสอบถังที่ล้าสมัย:

ถังเบียร์ล้าสมัย

การอัพเกรดถังที่ล้าสมัยทั้งหมด:

ชงถังอัพเกรด

หากคุณต้องการอัปเกรด cask เฉพาะให้เพิ่ม cask-name หลังจากอัปเกรด (เช่น 4k-video-downloader):

ชงถังอัพเกรด 4k-video-downloader


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


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.