Nâng cấp tất cả các thùng được cài đặt qua Homebrew Cask


157

Tôi sử dụng Homebrew Cask để cài đặt các ứng dụng trên OS X. Làm cách nào để nâng cấp tất cả các thùng đã cài đặt?


3
Câu hỏi được thêm vào: "làm thế nào tôi chỉ cần nâng cấp một trong các thùng?"
Matthew Harwood

Tôi sẽ rất thích thú với điều đó ... dường như không có cách nào để nâng cấp thùng, nhưng nó không có ý nghĩa gì. Tôi đã cài đặt Brackets 1.3 và tôi đã cài đặt các plugin bên trong ngoặc. Bây giờ đã hết 1.4, tôi muốn nâng cấp, nhưng vẫn giữ các plugin. Tôi không thấy làm thế nào tôi phải làm điều đó.
Jean-François Beauchef

Liên quan đến Chân đế cụ thể, các tiện ích mở rộng người dùng trên OS X cho Chân đế được lưu trữ ~/Library/Application Support/Brackets/extensions/uservà chúng phải được nâng cấp trong suốt quá trình nâng cấp. Các plugin hệ thống thực sự được lưu trữ trong gói ứng dụng Brackets.app/extensions/defaultvà chúng bị mất khi bạn thay thế gói ứng dụng, nhưng cách dễ nhất là sao chép các plugin từ gói cũ sang gói mới.
Caleb Xu

FYI: Triển khaibrew cask upgrade sáp nhập 15 cam kết vào Homebrew: master
l --marc l

Cách duy nhất tôi tìm thấy để nâng cấp một thùng duy nhất là brew cask uninstall my-cool-casksau đó brew cask install my-cool-cask.
Aaron Gray

Câu trả lời:


291

Cuối cùng cũng đã có một cơ chế nâng cấp chính thức cho Homebrew Cask (xem Vấn đề 3396 để thực hiện)! Để sử dụng nó, chỉ cần chạy lệnh này:

brew cask upgrade

Tuy nhiên, điều này sẽ không cập nhật các nhóm không có thông tin phiên bản ( version :latest) hoặc các ứng dụng có cơ chế nâng cấp tích hợp ( auto_updates true). Để cài đặt lại các thùng này (và do đó nâng cấp chúng nếu có bản nâng cấp), hãy chạy lệnh nâng cấp với --greedycờ như sau:

brew cask upgrade --greedy


3
Cảm ơn @mipadi đã sao chép câu trả lời của tôi dưới đây vào câu hỏi này mà không cần trích dẫn hoặc nâng cấp. Dù sao bây giờ điều này có vẻ hoàn thành.
enrico.bacis

3
@ enrico.bacis: Ớt. Tôi không thấy câu trả lời của bạn và đây là một bổ sung rõ ràng. (Và đối với bản ghi, bạn nên chỉnh sửa câu trả lời này thay vì thêm câu trả lời mới.)
mipadi

2
Điều này thực sự làm tôi khó chịu vì vậy tôi đã tạo tập lệnh này để cập nhật tất cả các ứng dụng Bia và cho phép người dùng chọn ứng dụng Cask nào để cập nhật. Bạn cũng có thể loại trừ các ứng dụng khỏi sự cân nhắc. github.com/derrekyoung/ScriptsAndUtils/blob/master/iêu
Derrek

14
Bây giờ bạn có thể sử dụng brew cask outdated | xargs brew cask reinstallđể chỉ cài đặt lại các thùng lỗi thời.
phdoerfler

2
Điều quan trọng cần lưu ý là brew cask outdatedchỉ in ra tên của các ứng dụng không bật "tự động cập nhật". Để nâng cấp TẤT CẢ các ứng dụng đã lỗi thời, hãy sử dụngbrew cask outdated --greedy --verbose | grep -v '(latest)' | awk '{print $1}' | xargs brew cask reinstall
jmk

47

nâng cấp homebrew-thùng

Tôi nghĩ rằng đây là giải pháp tốt nhất để nâng cấp các thùng.
nguồn: https://github.com/buo/homebrew-cask-upTHER

Cài đặt và sử dụng

brew tap buo/cask-upgrade
brew update
brew cu

(Tùy chọn) Buộc nâng cấp các ứng dụng lỗi thời bao gồm những ứng dụng được đánh dấu là mới nhất:

brew cu --all

@XingangHuang có
mất ngủ

26

Có thể liệt kê các thùng được cài đặt với:

brew cask list

Và buộc cài đặt lại một thùng với:

brew cask install --force CASK_NAME

Vì vậy, chuyển đầu ra của lệnh đầu tiên sang lệnh thứ hai, chúng tôi cập nhật tất cả các nhóm:

brew cask list | xargs brew cask install --force

1
Điều đó không thực sự cập nhật các thùng. Nó buộc cài đặt lại, ngay cả đối với các thùng không có bản cập nhật có sẵn. Tùy thuộc vào số lượng thùng bạn đã cài đặt và thời gian chúng được cài đặt, điều này có thể kích hoạt các tải xuống không cần thiết, mất nhiều thời gian và lời nhắc để truy cập sudo.
Burhan Ali

20

Tập lệnh Bash để nâng cấp gói

lấy cảm hứng từ câu trả lời của 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

Những gì nó làm

  • cập nhật thùng bia / bia, dọn dẹp
  • đọc danh sách các nhóm
  • kiểm tra brew cask infophiên bản mới nhất
  • cài đặt phiên bản mới nếu có (và xóa tất cả các phiên bản cũ!)

nguồn: https://gist.github.com/atais/9c72e469b1cbec35c7c430ce03de2a6b

Một lót cho thiếu kiên nhẫn:

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

lưu dưới dạng /usr/local/bin/cask-upgrade , vì vậy bạn có thể chạy nó cục bộ như cask-upgradesau


Bạn không thể làm gì brew cask info $cask | grep "Not installed"?
Det

@Det hah ... tôi không thấy nó, nhưng tôi làm bây giờ. Vâng, tôi có thể làm điều đó trong phiên bản tiếp theo ;-)
Atais

1
$ brew cask info $cask | grep "Not installed"đưa ra lỗiError: This command requires a Cask token
eduncan911

1
@ eduncan911 bạn sử dụng nó với tập lệnh, saufor cask in ${casks[@]}; do
Det

smacks headchắc chắn! không thể tin rằng tôi đã không nắm bắt được điều đó.
eduncan911

11

Kể từ tháng 12 năm 2017 sử dụng: nâng cấp thùng bia

[ĐỔI kể từ tháng 12 năm 2017 khi Homebrew giới thiệu lệnh nâng cấp cho thùng] Tôi chỉ đơn giản sử dụng như sau:

brew cask outdated | xargs brew cask reinstall


Về cơ bản những gì tôi cũng làm, ngoại trừ tôi đã được chuyển sang awk '{print $1}'giữa hai.
Paul Nelson Baker

6

Đây là chức năng tôi đã viết để xử lý việc này. Lưu ý rằng cá nhân tôi không muốn nó chỉ cài đặt lại một cách mù quáng mọi thứ vì một số thùng tôi sử dụng mất một thời gian để cài đặt hoặc yêu cầu nhắc nhở thêm.

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 
} 

Tôi đang chạy OS X El Capitan, nhưng khi tôi thử nghiệm chức năng này, tôi đã gặp phải lỗi hệ vỏ vì - không phải là ký tự được phép trong tên hàm . Sự khác biệt quan trọng - mặc dù nó hoạt động trong bash nhưng nó không được phép sử dụng vì vậy nếu bạn sử dụng #! / Bin / sh để tương thích giữa các hệ thống có nhiều hệ vỏ thì điều này sẽ không hoạt động. Thay đổi dấu gạch nối thành dấu gạch dưới hoạt động tốt, mặc dù.
Bryan 'BJ' Hoffpauir Jr.

5

Dựa trên câu trả lời của @Atais, tôi đã nâng cao logic của anh ấy thành thứ gì đó đẹp hơn. Tôi muốn một cách để kiểm tra các gói để nâng cấp trước, trước khi thực sự buộc nâng cấp.

  • $ brew-cask.shchỉ liệt kê một đầu ra tương tự như của Homebrew brew update.
  • danh sách trên hiển thị tất cả các gói được cài đặt, với màu xanh lục cho biết mọi cập nhật đang chờ xử lý.
  • $ brew-cask.sh upgrade sẽ buộc nâng cấp các gói đó.

Mã số:

# 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

chỉ cần cài đặt nó (còn gọi là "Tôi cần nó ngay bây giờ!")

Nó được kiểm tra vào repo của tôi.dotfiles ; vì vậy, bạn có thể cài đặt nó nhanh chóng vào ~/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

Sau đó sử dụng nó như vậy:

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

Nếu bạn không có ~/bintrong đường dẫn của mình, hãy thêm tiền tố ~/bin/vào các câu trên.


5

brew cask upgrade

Các upgradelệnh gần đây đã được giới thiệu trong Homebrew Cask và nên không dùng tất cả các phương pháp thủ công khác được mô tả trong các câu trả lời khác.


Mặc dù lệnh này tồn tại, nó thực sự không nâng cấp một số gói.
Acumenus

4

Tôi nghĩ rằng sử dụng

brew cask reinstall `brew cask outdated`

sẽ thực hiện các mẹo. Điều này cũng sẽ giúp loại bỏ các phiên bản trước của ứng dụng và sẽ cài đặt phiên bản mới hơn.


2
bây giờ nên làbrew cask reinstall `brew cask outdated`
gbonetti

1
Cảm ơn đã cập nhật @gbonetti. Bạn nói đúng. Với tùy chọn "lỗi thời" mới, tác vụ cũng trở nên dễ dàng và nhanh hơn :-).
Pranab Agarwal

2

cải thiện mã được cung cấp từ deinspanjer, tôi đã cố gắng bắt chước một lệnh noop, giống như mã từ chocolatey ( cập nhật choco --noop / choco đã lỗi thời ).

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

Như mọi người có thể thấy, tôi đang sử dụng một phương pháp mô-đun vì trường hợp sử dụng của tôi khác đi một chút. Tôi không muốn ngồi trước máy tính của mình và gõ có / không cho mọi ứng dụng tôi đã cài đặt. Mặc dù không có cách nâng cấp thực sự nào (chỉ cài đặt lại phiên bản mới nhất), trước tiên tôi thực hiện cập nhật brew để có thông tin thực sự có bản cập nhật .

Tiếp theo, tôi quay vòng qua tất cả các thùng để hiển thị thông tin của họ. Bởi vì tôi đã cập nhật brew trước đây, giờ đây người ta đã cung cấp thông tin rằng một số phiên bản mới nhất của thùng chưa được cài đặt.

Trong phương thức cập nhật của tôi, tôi thực sự phân tích lệnh thông tin cho dòng cụ thể đó:

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

Điều này có nghĩa là: "Đưa ra 3 dòng trên thông tin được cung cấp bất cứ khi nào bạn đọc dòng" chưa được cài đặt ". Sau đó xóa bất kỳ dòng nào có liên kết trong đó, cũng xóa một dòng có ':' trong đó."

Với cấu trúc của lệnh thông tin thùng bia, chúng tôi kết thúc bằng một dòng (không có thông tin phiên bản, không có URL ứng dụng), phản ánh tên thật của thùng mà nó cũng được cài đặt.

sản xuất thông tin thùng

Trong phiên bản của tôi, thông tin này hiện được in ra để người ta có thể dễ dàng xem những gì đã hết hạn và có thể được cập nhật.

Tại thời điểm này tôi thực hiện một trường hợp chuyển đổi, bởi vì có lẽ ngay bây giờ không đủ thời gian để cập nhật mọi thứ. Nó phụ thuộc vào trường hợp sử dụng của bạn. Đối với tôi, đôi khi tôi chỉ muốn xem những gì mới (chờ phiên bản mới, sửa lỗi) nhưng thực sự không có thời gian để cập nhật mọi thứ vì ngay bây giờ tôi không muốn đóng trình duyệt của mình, v.v.

Vì vậy, nếu một người chọn "có", danh sách các tên được làm sạch sẽ được cung cấp cho chức năng cập nhật, trong đó đối với mỗi thùng được xác định là hết hạn, việc cài đặt lại được ban hành.

Một lần nữa cảm ơn deinspanjer, trong khi cố gắng giải quyết vấn đề này cho chính mình, tôi luôn quên phát hành bản cập nhật bia trước đó để không có dòng "không được cài đặt" ở đó để thực sự phân tích (nền tảng của toàn bộ cách tiếp cận của tôi).

Tôi hy vọng nó sẽ có ích.


2

Tôi tự làm kịch bản như vậy. Vui lòng xem github https://github.com/pesh1983/brew_cask_upTHER . Nó có mô tả khá tốt, nhưng nếu bạn có bất kỳ câu hỏi nào, hãy hỏi tôi. Nó thực hiện nâng cấp công bằng: gỡ cài đặt và cài đặt, do đó, mọi thao tác dọn dẹp cần thiết sẽ được thực hiện bởi chính 'brew'.



2

nhận được các thùng lỗi thời:

thùng bia lỗi thời

thùng nâng cấp:

thùng bia cài đặt lại lỗi thời-thùng

kịch bản demo:

$ 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

Dựa trên những gì tôi đã đọc, tôi đã tạo một tập lệnh sẽ tạo một tệp liệt kê các tệp sẽ được cập nhật bao gồm các ứng dụng được xác định là mới nhất. Sau đó, bạn có thể sửa đổi tệp cho phù hợp với yêu cầu của mình và cài đặt các bản cập nhật bằng tập lệnh olinst của tôi.

Để biết thêm thông tin truy cập github của tôi.

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




1

Kiểm tra các thùng lỗi thời:

thùng bia lỗi thời

Nâng cấp tất cả các thùng lỗi thời:

nâng cấp thùng bia

Nếu bạn muốn nâng cấp thùng cụ thể, chỉ cần thêm tên thùng sau khi nâng cấp (ví dụ: 4k-video-downloader):

nâng cấp thùng bia 4k-video-downloader


2
Xin chào, chào mừng bạn đến với StackOverflow. Cho rằng đây là một câu hỏi cũ với nhiều câu trả lời, một trong hai câu hỏi cực kỳ phổ biến và được chấp nhận, vui lòng chỉnh sửa câu trả lời của bạn để cung cấp thêm chi tiết về cách trả lời câu hỏi và lý do tại sao câu trả lời thích hợp hơn. Cảm ơn.
MandyShaw
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.