[mac] brew update? upgrade?

2022. 8. 16. 02:08Dev/Note

Mac 을 켜고 나서 항상 하는 첫번째 루틴은 iterm 을 열어 업데이트를 해주는 것이다. 필수는 아니지만 스마트폰 카톡의 안읽은 메시지 갯수 배지를 가만히 놔둘 수 없는 것과 비슷한 것이라 생각한다. outdated 버전을 사용한다고 해서 내 일에 지장이 있었던건 경험상 지금까지 단 한번도 없었지만 그래도 안하면 뭔가 찝찝한 느낌이다.(마찬가지로 mac 업데이트, app store 업데이트도 바로바로 하는 편)

 

중요한건 이게 아니고.

 

이때 homebrew에서 사용하는 두가지 명령어가 있다. `update` 와 `upgrade`

> brew update
> brew upgrade

순서가 중요하다. 항상 update -> upgrade 순서다.

 

우리는 흔히 오래된 것을 새것으로 갱신하는 것을 '업데이트' 한다라고 말하기 때문에 항상 혼란이 온다. '갱신(update)'만 써도 되지 않을까 혹은 update 를 마지막에 써줘야 하는게 아닐까 하고. 


UPDATE

Fetch the newest version of Homebrew and all formulae from GitHub using git(1) and perform any necessary migrations.

--merge: Use git merge to apply updates (rather than git rebase).
--auto-update: Run on auto-updates (e.g. before brew install). Skips some slower steps.-f, 
--force: Always do a slower, full update check (even if unnecessary).

<from homebrew manpage(link)>

Fetch 와 formulae 가 이 설명의 핵심이라 볼 수 있는데 이 두가지를 설명하기 위해서 homebrew 의 작동 방식에 대해서 간단하게 이해하고 갈 필요가 있다.(여기서 간단하게 확인하고 가자 - link)

 

homebrew 에서 설치가 가능한 것은 두 종류가 있다. formula / cask 

formula : Homebrew package definition built from upstream sources
cask : Homebrew package definition that installs macOS native applications

<from homebrew manpage(link)

쉽게 얘기하면

  • formula : cli 에서 설치
  • cask : gui 로 설치

 

update 는 저장소에 저장되어 있는 최신버전의 formula 들을 가지고(fetch) 와서 로컬시스템에 저장되어 있는 패키지의 정보들을 갱신한다. 마치 git 의 fetch 명령어와 비슷하다.

 

update 명령어가 하는건 homebrew 에서 현재 유지하고 있는 패키지의 정보를 homebrew 저장소로부터 최신 버전을 가지고 와서 갱신하는 것이다.

 

 

UPGRADE

Upgrade outdated casks and outdated, unpinned formulae using the same options they were originally installed with, plus any appended brew formula options. If cask or formula are specified, upgrade only the given cask or formula kegs (unless they are pinned; see pin, unpin).

Unless HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK is set, brew upgrade or brew reinstall will be run for outdated dependents and dependents with broken linkage, respectively.

Unless HOMEBREW_NO_INSTALL_CLEANUP is set, brew cleanup will then be run for the upgraded formulae or, every 30 days, for all formulae.

<from homebrew manpage(link)>

우리가 기대하는, 원하는 행위인 upgrade 이다. 기본적으로 이전에 설치했을때의 옵션을 그대로 적용해서 설치한다.

(추가로 위 공식설명에서 나오는 pin 이라는 용어는 command의 하나로, 현재 버전에서 더이상 업데이트 하지 않으려면 pin 명령어를 사용해주면 된다.)

 

upgrade 는 formula 와 cask 모두 upgrade 해주지만, cask 의 경우 upgrade 커맨드 만으로는 정상적으로 upgrade 되지 않는 경우가 있다. 위에도 언급했지만 cask는 GUI application 이다. 대부분의 Mac GUI application 은 자체적으로 업데이트 기능을 지원하고 있기 때문에 brew 에 의한 upgrade와 자체적인 업데이트 사이에서의 충돌을 회피하기 위함이다. 

 

homebrew 의 upgrade 는 homebrew 저장소의 패키지 정보파일을 통해서 최신버전 여부를 판별하고 upgrade 할 수 있는데 이는 application 의 자체적인 업데이트 기능과 서로 동기화 되지 않기 때문이다.

After running brew upgrade, you may notice some casks you think should be upgrading, aren’t.
As you’re likely aware, a lot of macOS software can upgrade itself:

That could cause conflicts when used in tandem with Homebrew Cask’s upgrade mechanism.
When software uses its built-in mechanisms to upgrade itself, it happens without Homebrew Cask’s knowledge, causing both versions get out of sync. If you were to then upgrade through Homebrew Cask while we have a lower version of the software on record, you’d get a downgrade.

<from homebrew faq, Why aren’t some apps included during brew upgrade?(link)>

그래서 cask 로 설치된 GUI application 은 brew 든 자체업데이트든 한가지로만 업데이트 하는 것이 나을 것 같다.

 

아래는 그래도 brew로 upgrade 하고자 할 경우

 

1. upgrade 하고자 하는 cask를 지정해서 upgrade

> brew upgrade <cask>

 

2. greedy option (아래 3가지 중 원하는 것으로 사용)

# Also include casks with auto_updates true or version :latest.
> brew upgrade --greedy

# Also include casks with version :latest.
> brew upgrade --greedy-latest

# Also include casks with auto_updates true.
> brew upgrade --greedy-auto-updates

 

'Dev > Note' 카테고리의 다른 글

[mac] Homebrew 의 동작 방식에 대한 간략한 이해  (0) 2022.08.15