elsa in mac

macOS - 맥 사용자들의 필수 앱, 패키지 관리자 brew 설치 및 사용법 본문

Mac(OS X)/Terminal

macOS - 맥 사용자들의 필수 앱, 패키지 관리자 brew 설치 및 사용법

elsa in mac 2023. 12. 28. 20:15

Homebrew는 macOS 운영체제에서 open-source 패키지를 관리하는 CLI 도구 입니다.
Homebrew를 사용하면 Termianal CLI(Command Line Interface) 도구나 라이브러리들 뿐만 아니라, Homebrew에 등록된 open-source GUI 앱, 애플의 app store macOS GUI 앱까지 설치, 업데이트, 제거 등의 관리를 쉽게 할 수 있습니다.

homebrew 홈페이지에 접속을 하면, 아래와 같이 설치하기 위한 명령어를 안내하고 있습니다. 복사합니다. macOS의 기본 터미널 앱을 실행한 후, prompt 상에서 복사한 명령을 붙여넣기 한 후 enter를 눌러 줍니다.

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

명령을 실행하면, 관리자 패스워드를 물어 보는데. 자신의 로그인 패스워드를 넣어 주면 됩니다. 보안상 입력되는 암호는 표시되지 않습니다.

설치가 실행되면, 곧 XCode Command Line Tools를 설치할 것인지를 물어 봅니다.

brew를 통해 설치할 패키지들 중에는 source code를 받아 본인의 mac에서 build를 해야 하는 것들도 있습니다. 이런 경우에 빌드에 필요한 도구들이 필요한데, 이것들이 Xcode Command Line Tools 입니다. 당연히 설치를 해 줍니다. (Enter)

설치가 정상적으로 잘 이뤄지면 맨 마지막에 아래와 같이 Next Steps 라는 항목에 두 개의 명령을 실행하라는 것이 보입니다.

(echo; echo 'eval "$(/opt/homebrew/bin/brew shellenv)"') >> /User/elsa/.zprofile

eval "$(/opt/homebrew/bin/brew shellenv)"

 

위의 두 명령행은 디렉토리명과 사용자 계정이 다르기 때문에, 복사붙여넣기로 사용하시면 안됩니다. 그냥 예시로 넣은 것입니다. 실제로는 본인의 터미널에 표시된 것을 복사해서 사용해야 합니다.

설치가 되었고, 정상적으로 brew를 사용할 준비가 되었는지를 확인하려면, 아래와 같이 brew -v 를 실행해 봅니다. 

Homebrew의 버젼이 표시되면 brew가 정상적으로 잘 설치되었고 실행된다는 것입니다.  이렇게 해서 homebrew 설치를 완료 했습니다. 이제 brew 도구를 통해 패키지 설치, 업그레이드, 삭제 등 기본적인 사용법을 알아 보겠습니다.


패키지 검색
brew search [패키지명]
패키지를 설치하기에 앞서 해당 패키지가 brew를 통해 설치할 수 있는지를 확인하려면, search 명령을 사용하면 됩니다. 

위의 스샷을 보면 brew search bat 명령을 내린 것을 알 수 있습니다.  그 아래로 정보들이 출력되는 것을 확인할 수 있는데, 대부분의 다른 패키지 관리자들 처럼 brew도 “레시피”라는 개념이 있습니다. 위의 스샷을 보면, Formulae 와 Casks 라는 두 개의 카테고리가 보일 것입니다. 우리가 요리를 만들때, 이미 준비된 “레시피” 목록에 나와 있는 요리만 만들 수 있다고 가정할 경우, 그 레시피 목록이 Formulae와 Casks 입니다.  Formulae는 기본 레시피로 주로 terminal 기반의 CLI 도구나 라이브러리 등의 목록을 포함하고 있고, Casks는 Github등에서 배포하는 오픈소스 macOS GUI 앱 목록입니다. 

사실 brew가 다루는 레시피는 크게 3가지 입니다. formulae, casks, mas. 위의 예에서는 mas가 보이지 않는데 mas는 apple이 직접 운영하는 App Store의 GUI 앱들을 관리할 수 있는 도구로 이것은 mas-cli라는 CLI 도구를 설치해야만 확장성을 갖게 됩니다. 이번 포스트에서는 다루지 않습니다. 

다시, 위의 스샷을 보도록 하죠. 사용자가 bat이라는 패키지에 대한 검색을 요청했는데, brew는 굉장히 많은 패키지 목록을 보여 주고 있다는 것을 알 수 있습니다. brew는 사용자가 요구한 패키지 명이 “불명확하다.” 라는 것을 기본 전제로 가정합니다. 즉, bat이라는 것이 온전한 패키지명인지, 아니면 패키지명의 일부인지를 판단할 수 없습니다.  따라서, bat이거나 혹은 bat이 포함된 패키지 목록을 전부 다 보여 주게 됩니다.

만일, 진짜로 사용자가 불명확한 패키지 명으로 bat을 넣은 것이라면.. 위에 나열된 페키지 목록에서 확인하고 실제 내가 설치하고자 하는 패키지가 맞는지를 좀 더 구체적으로 확인할 필요가 있을 것입니다. 이를 위해 info 명령을 갖고 있습니다. 

위의 스샷을 보면  bat에 대한 정보를 요구하는 명령을 내린 것을 알 수 있고, brew는 해당 정보를 알려 주고 있습니다. 
내용을 보면, bat이라는 패키지가 안정화 버전이 0.24.0이고, HEAD 라고 되어 있습니다. HEAD는 가장 최신 버전을 의미 합니다. 아래는 해당 패키지의 open-source 주소가 나와 있고.. not installed 라고 되어 있으니, 아직 설치를 한 패키지는 아니라고 알려 주고 있습니다. 그 아래로 Build와 Required 항목이 보이는데, 이는 해당 패키지를 필드하려면 pkg-config와 rust 패키지가 필요하다는 것이고, bat을 사용하기 위해서는 libgit2와 iniguruma 라이브러러기 설치되어 있어야 한다는 것을 알려 줍니다. 즉, 빌드 종속성과 실행 종속성 패키지 항목을 알려 주는 것이지요.  맨 마지막에 Analytics 항목은 최근 한달, 분기, 년 기간 동안에 몇번이나 설치가 되었는지의 기록과 빌드시에 오류가 보고된 것이 있는지의 여부를 보여 줍니다.


패키지 설치
패키지 검색과 확인하는 방법까지 알아봤으니, 이젠 설치하는 방법을 알아 봅시다. 이 포스트를 따라 bat을 연습을 하실 분들은 설치해도, 설치를 안 해도 무방합니다.  원래 macOS의 기본 CLI 중에 cat이라는 명령어가 있습니다. cat은 concatenate의 줄임말로 여러 파일을 결합하거나 단일 파일의 내용을 터미널에 보여주는 기능을 하는 명령어 입니다. bat은 이 cat의 기능을 보다 향상시킨 버전입니다. 

패키지를 설치할 때는 install 옵션을 사용합니다.  brew install [패키지명]  , []는 설명을 위한 것입니다. 

위의 스샷에서 brew install bat으로 bat 패키지의 설치를 명령한 것을 알 수 있습니다. brew는 bat을 설치하고 실행할 때 , 필요한 dependecy(종속성) 패키지들을 함께 다운로드 받을 수 있습니다. 경우에 따라서는 bat을 실행하기 위해 필요한 종속성 패키지가 또 다시 요구하는 종속성 패키지를 필요로 할 수도 있습니다. 따라서, 하나의 도구를 설치 하더라도 생각과는 달리 많은 패키지들이 설치될 수 있습니다. 

위의 스샷은 설치의 맨 마지막 부분으로 결론적으로 bat의 설치가 성공적으로 이뤄 졌음을 알 수 있습니다. 
그럼 다시 brew info bat으로 해당 패키지의 정보를 확인해 볼까요 ?

앞서 설치 전 확인한 info 와는 다르게, 패키지가 설치된 위치와 구성 파일 수, 용량 등을 표시해 줍니다. 소스코드를 받아서 빌드한 것이 아니기 때문에, build 항목의 종속성은 없지만, 실행 종속성과 관련되어 libgit2와 oniguruma 라는 패키지가 설치되었음을 확인할 수 있습니다. 

앞서, bat은 cat CLI 도구의 기능을 향상 시킨 도구라고 설명을 해 드렸지요?
아래의 스샷은 cat으로 main.rs라는 rust 언어의 소스코드를 출력한 예 입니다. 

그리고, 아래는 새로 설치한 bat으로 동일한 파일을 확인한 결과 입니다. 

라인 넘버와 Syntax-Highlighting 기능으로 포함하고 있어서 소스코드를 보다 쉽고 직관적으로 확인할 수 있는 차이가 있다는 것을 알 수 있습니다. 

자 이렇게 해서 새로운 패키지를 설치할 경우에는 brew install 명령을 사용하면 된다는 것을 알아 봤습니다. 


패키지 제거
설치하는 방법을 알아봤으니, 이번엔 반대로 제거하는 방법도 알아 봐야 합니다. 패키지를 제거하는 방법은 크게 2가지가 있습니다. 
첫번째는 종속성을 무시하고 해당 패키지만 제거하는 것입니다. 두 번째 방법은 종속성을 포함하여 제거하는 것입니다. 

두 방법 공히 사용하는 옵션은 uninstall 입니다 

brew uninstall bat 이렇게 명령을 내리면, bat 패키지를 제거 합니다. bat을 설치할 때, 같이 설치되었던 종속성 패키지들은 제거하지 않습니다. 밤년, brew uninstall —recursive bat 이렇게 확장 옵션을 주고 제거 명령을 내리면, bat과 bat을 설치할 때 함께 설치되었던 종속성 패키지도 함께 제거하게 됩니다. 

다만, 종석성 패키지들이 여타 다른 설치된 패키지들에 있어서도 종속성을 갖고 있는 상황이라면, 당연히 해당 패키지는 삭제되지 않고 남게 됩니다.  소위 “케바케(case by case)”인 셈이죠.. 이걸 일일히 사용자가 관리한 다는 것이 다소 무리가 있습니다. 얼마나 많은 패키지들을 불 특정 시간에 설치했는지 사용자가 기억할 수 없는데, 종속성을 일일히 따져가며 관리할 수는 없겠지요.

이런 불편함을 방지하고자 brew에는 autoremove 라는 명령을 갖고 있습니다. 

brew autoremove 명령을 내리면, brew는 설치된 패키지들을 모두 검사하여 정말 필요가 없어진 패키지와 설치시 다운로드 받았던 소스코드, 로그 파일들과 빌드 부산물등등을 일괄적으로 정리해 주게 됩니다. 따라서 사용자는 가끔 생각이 날 때, 한번씩 brew autoremove 명령으로 청소를 해 주면 되겠죠.

그래서 일반적으로는 그냥 brew uninstall [패키지 명] 이렇게 추가 옵션 없이 제거하기만 하면 됩니다. 

위의 스샷을 보면, bat만 제거하라고 요청했고, 그래서 brew는 bat만 딱 제거한 것을 알 수 있습니다.
아래는 brew autoremove 명령을 내린 것 입니다. 

ce-certificate, libgit2, libssh2, oniguruma, openssl@3 등 총 5개가 제거 대상임을 알 수 있습니다.  헌데, 아래 Warninig! 이 하나 발생했군요. openssl@3 의 경우에는 제거를 하지 못했으니, 정말로 지우고 싶으면 rm -rf 명령으로 직접 지우라고 알려 주고 있습니다. 이런 경우는 보다 구체적으로 내용을 확인한 후 직접 제거를 해 주면 될 것입니다. 


패키지 업데이트
다음은 패키지 업데이트에 대해 알아 보겠습니다.  패키지를 설치하고 사용하다 보면, 해당 패키지의 기능이 향상되거나 잠제적 버그가 수정되거나 할 수 있습니다. 우리는 brew outdated 명령을 통해 현재 설치된 패키지들 중 어떤 패키지가 업데이트 되었는지를 확인할 수 있습니다. 

아래는 brew outdated 명령을 수행한 결과 입니다. 

보면, 현재 설치된 open-api 라는 패키지가 5.0.0.1 이고, 최신 버전은 5.0.1 이상이라는 것을 알려 줍니다.  즉, 업그레이드가 필요하다는 것이죠. 이렇게 확인이 된 경우, brew upgrade 명령을 내리면, 업그레이드를 해 주게 됩니다.  보통의 경우에는 brew outdated로 확인하지 않고, 그냥 brew upgrade를 통해 업데이트 합니다. 참고로, brew update 라는 명령이 있는데, 이것은 brew자체를 업그레이드 하는 명령 입니다. 

brew outdated 명령으로 확인했을때 여러 개의 항목들이 나열된 경우, 사용자의 판단에 의해서 특정 패키지만 업그레이드를 하고자 한다면, brew upgrade [패키지 명] [패키지 명] … 이렇게 뒤에 패키지 명을 명시해 주면 됩니다. 패키지가 여러 개 일 경우에는 스페이스 키로 구분해 줍니다. 

자, 이젠 마지막으로 bundling에 대해 알아 보도록 하겠습니다. 


패키지 목록 관리
두 가지 경우를 가정해 보도록 하겠습니다. 첫 번째로 macOS를 잘 사용하다가 어느날 갑자기 이상이 생겨서 macOS를 완전히 새로 설치해야 할 상황이 발생했다고 가정해 봅니다. macOS는 apple이 제공하는 기능을 이용해서 크린 설치를 하면 되지만, 그 동안 설치했던 brew 패키지들은 어떻게 다시 설치를 할 것인가 ? 

두번째 케이스는 새로운 mac를 추가로 들여왔다고 가정하고 지금 사용하고 있는 macOS와 동일한 환경을 구축한다고 했을때, 새 mac에도 동일한 brew 패키지들을 설치해야 한다면 ?  

위의 두 가지 경우 모두 막막해 질 것 입니다. 장 기간에 걸쳐 사용한 경우가 대부분이라. brew list 명령으로 확인은 할 수 있지만, 그 수 많은 패키지들을 일일히 설치한다는 것이 굉장히 부담될 수 있습니다. 

위와 같은 경우를 대비해서 brew에서는 bundle 이라는 명령을 제공합니다. 

우선, 현재 macOS에서 brew bundle dump 명령을 내리게 되면, 현재 폴더에 Brewfiles라는 txt 파일을 생성하게 됩니다. 이 파일에는 현재 macOS에 설치된 패키지들의 정보가 고스란히 포함되게 됩니다. 일일히 사용자가 확인할 필요가 없는 셈이죠. 참고로 brew bundle dump 명령을 최초로 실행했을 때는 Brewfile이라는 파일이 생성되지 않습니다. 그래서, 한번 더 같은 명령을 내려 줘야 합니다. 이 후로는 한번씩 만 명령을 내려 주면 됩니다.

그리고, 사용자 계정의 root 디레토리의 항목들을 확인해 보면, 아래와 같이 Brewfile 이 생성된 것을 알 수 있습니다. 

bat으로 내용을 확인해 보면, 아래와 같습니다. 

tap 은 brew의 레시피 저장소(repository) 주소를 의미합니다. 그리고, 해당 저장소를 통해 bat을 설치했다는 것을 알 수 있죠.
특정 패키지의 경우 개발자나 커뮤니티에서 관리하는 저장소의 패키지를 설치할 경우도 있는데, 이런 경우에는 별도의 tap으로 식별되어 설치된 패키지 정보가 포함될 것 입니다. 

사용자가 패키지를 추가할 때마다 Brewfiles가 자동으로 업데이트가 되면 좋겠지만, 자동으로 업데이트가 되지는 않습니다. 왜냐하면, 사용자가 brew를 사용하면서, 설정이 엉킬 수 있기 때문입니다. 패키지를 설치하거나 삭제할 때마다 자동으로 갱신된다면, 오히려 과거로 돌아갈 수 있는 방법이 없어지게 되는 셈 입니다. 따라서, 안정적인 상태가 확인되었을 때 가끔씩 백업의 개념으로 dump를 해 주는 것이 좋습니다.  만일 특정 위치에 해당 파일을 생성하고 싶다면, brew bundle dump --file=[파일 경로] 이렇게 해 주면 됩니다.  

예를 들어, 외장 SSD에 저장하고 싶다면.

brew bundle dump —file=/Volumes/extSSD/Brewfiles-2024-01-01

이런식으로 할 수 있겠죠..

자, 그럼 반대로 나중에 새로운 mac 이나, macOS를 새로 설치 했을 때 사용하는 방법은 brew를 설치한 후, brew bundle install —file=[파일 경로명]  이렇게 bundle install 옵션으로 명령을 내리면 됩니다. 

그럼, brew는 해당 파일의 내용을 참조하여, 일괄적으로 패키지들을 자동 설치하게 됩니다. 따라서, 사용자가 현재 사용 중인 mac에 macOS 를 크린설치 하고자 할 경우, 잊지 말고.. 반드시, 꼬~옥 macOS 설치 전에 brew bundle 작업을 해 줘야 합니다. 


이번 포스트에서는 macOS용 오픈소스 패키지 관리자인 homebrew를 설치하고 사용하는 기본적인 방법을 알아 보았습니다. 깊이 있게 들어가면 더 다양한 명령과 옵션들이 존재하지만.. 위애 설명한 정도만으로도 패키지 관리하는데 있어서는 충분합니다. 

무엇보다도 Terminal CLI 도구, 라이브러리, 오픈소스 macOS GUI 앱등을 brew를 통해 설치하고 관리하면.. 사용자가 일일히 확인하고 업데이트하거나 삭제가하거나 할 필요가 없으니 macOS 관리가 쉽고 한결 편해지게 됩니다. 그래서 혹자들은 brew는 macOS 사용자의 필수 앱 이다라고 까지 말하는 것이겠죠.  이제 막 macOS에 입문하신 분들이라면.. 꼭 brew 설치해서 사용하시기를 권합니다. 

공유하기 링크
Comments