Gerenciar pacotes no macOS é um processo que não é nativo, por isso é necessária a utilização de algum gerenciador externo (de terceiros), que não tira de modo algum a excelência de tudo que foi criado. Com isso alguns gerenciadores conhecidos são:

A minha escolha foi a popularidade do Homebrew que fui apresentado, talvez seja por reflexo de pessoas e tutorias que vejo. Mas uso bastante e acho uma maneira muito simples de instalar e deixar os pacotes atualizados.

Mas por mais que Homebrew seja legal de instalar e atualizar vez ou outra os pacotes, é sempre interessante a curiosidade dos porques, por isso criei 2 arquivos anteriores que explicam coisas relacionadas ao funcionamento de:

O comportamento e gerenciamento do Homebrew é altamente relacionado ao git, então em alguns momentos saber sobre ele pode facilitar o entendimento.

Instalando Homebrew

A instalação do Homebrew é bem simples, pode ser consultada no link abaixo, onde sempre será a mais atual possível:

Depois para testar se tudo ocorreu da maneira correta, pode executar o comando:

$ brew doctor

Caso ocorra algum erro ou incompatibilidade, será descrita na saída do programa.

Tipos de pacotes

Seus pacotes são divididos em 2 tipos:

  • CLI: linha de comando, muito utilizado em Linux e compilados para macOS;
  • Casks: todos os softwares que possuem interfaces e/ou que são proprietários, como Firefox, Chrome, Gimp, Virtualbox, etc. A sua maioria são aplicativos instalados por padrão em /Applications, mas pode ser instalado por usuário utilizando a pasta ~/Applications.

Formulas

A formula é a representação de um pacote a ser instalado, é uma DSL de Ruby que descreve o que precisa e como precisa ser feito o processo de instalação. Esse processo pode ser a compilação antes da instalação na máquina de quem executou o comando, um binário pré combilado chamado de bottle ou script que pode ser instalado (por consequência, sua dependência é o interpredador dessa linguagem).

O repositório atual com todas as formulas oficiais é o Homebrew/homebrew-core e a pasta onde elas ficam é:

Todos essses arquivos são baixados a primeira vez para o seu computador com git clone, após isso atualizados com git pull. É possível também fazer modificaçõees locais e posteriormente o git gerenciar essas modificações, para efetuar uma modificação, utilize o comando:

$ brew edit <package>

Esse comando abre o editor padrão baseado na variável EDITOR ou HOMEBREW_EDITOR, a segunda pode ser utilizada caso queira abrir em um diferente do editor do sistema. Lembrando que pode ser alterada em tempo de execução, tenho um post sobre isso em:

Os detalhes estão no post acima, mas basicamente seria:

$ EDITOR=emacs brew edit <package>

Repositórios de terceiros

Estas formulas podem ser mantidas por terceiros e são referidas como taps, comumente armazenadas no Github, onde sempre são um repositório prefixado com homebrew-, algo como:

https://gihub.com/<username>/homebrew-<tap>

Assim adicionamos o repositório como:

$ brew tap <username>/<tap>

Note que se <username>/<tap> não for informado, são listados os taps já cadastrados.

Como o gerenciamento de formulas é feito via git, qualquer protocolo que ele saiba interagir é válido.

Para removermos um tap da lista, utilizamos:

$ brew untap <username>/<tap>

Atualizando índice de pacotes

É sempre importante atualizar o índice para ter as últimas informações sobre tudo o que se quer instalar. Na prática o Homebrew utiliza o git para gerenciar as formulas, fazendo um git pull dos repositórios em que elas estão versionadas.

$ brew update

É importante saber que quando o processo de atualização é iniciado uma trava (lock) nesse comando é feita para que mais de uma instância não seja iniciada ao mesmo tempo (comportamento comum em gerenciadores de pacotes). Não feche o terminal sem que o processo ternha acabado ou finalizado de forma correta, caso contrário será necessário apagar manualmente a trava.

Busca

A busca de um pacote é importante, para isso utilizamos:

$ brew search <name>

Esse comando filtra a busca com pacotes CLI e logo após os casks, é possível pesquisar apenas um tipo de cada utilizando as flags: --formula e --cask.

$ brew search --formula <name>
$ brew search --cask <name>

Informações sobre o pacote

É possível obter informações sobre um pacote utilizando o comando:

$ brew info <name>

Mesmo que <name> seja um cask a informação é exibida, porém se for utilizado em script deve quebrar, por que o código de retorno é diferente de 0. Então se não quiser receber esse código no script, pode utilizar:

$ brew cask info <name>

Esse código é armazenado na variável ? e sempre representa o código de saída do último programa executado no termial.

$ echo $?

Nesse comando também são exibidas informações sobre quais dependências de <name> foram suplidas e como configurar ele como dependência de compilação para seu código.

Instalar software via Homebrew

Para instalar um pacote, pode utilizar o comando:

$ brew install <name>

Caso seja um cask utilize:

$ brew cask install <name>

Como vimos casks podem ser instalados em /Applications ou ~/Applications, para isso utilizamos a flag --appdir:

$ brew cask install <name> --appdir <pasta>

Algo interessante é que o conteúdo de ambas pastas Applications é mostrado no Launchpad.

Se <name> está em um tap e já existe como formula padrão, pode ser instalado como:

$ brew install <username>/<tap>/<name>

Listar pacotes

Podemos listar pacotes instalados utilizando o comando:

$ brew list

Caso queira listar os casks instalados deve adicionar a flag --cask:

$ brew list --cask

Esse comando lista os pacotes CLI e logo após os casks, é possível listar apenas um tipo de cada utilizando as flags: --formula e --cask.

$ brew list --formula
$ brew list --cask

Listar pacotes desatualizados

Para os mais detalhistas ou que gostam de saber os mínimos detalhes de cada atualização, é possível saber quais pacotes estão desatualizados utilizando o comando:

$ brew outdated

Esse comando lista os pacotes CLI e logo após os casks, é possível listar apenas um tipo de cada utilizando as flags: --formula e --cask.

$ brew outdated --formula
$ brew outdated --cask

Também é possível obter esta lista em formato json, utilizando a flag --json.

$ brew outdated --json

Note que existe mais de uma versão do schema do JSON, pode verificar qual a padrão na versão do Homebrew que está utilizando usando a flag --help.

$ brew outdated --help

Atualizar pacotes

Fazer a atualização de algum pacote pode utilizar o comando:

$ brew upgrade <name>

Onde toda vez que <name> não for informado, todos os pacotes são atualizados.

Também é possível atualizar somente pacotes CLI ou casks, utilizando as flags: --formula e --cask.

$ brew upgrade --formula
$ brew upgrade --cask

Brewfile

O comando que ativa essa instalação é o:

$ brew bundle

Que no seu primeiro uso, faz a ativação/instalação do comando e se o arquivo Brewfile estiver no diretorio em que foi executado o comando, executa o que está descrito no Brewfile.

Para o uso global é utilizado o arquivo ~/.Brewfile com comando:

$ brew bundle --global

Caso o Brewfile não esteja nem no diretório corrente, nem na sua pasta ~, pode ser especificado utilizando a flag --file:

$ brew bundle --file=<file>

Depois de tudo que foi apresentado o Brewfile se torna auto explicativo:

# Taps
tap "caskroom/cask"
tap "caskroom/fonts"
tap "homebrew/bundle"
tap "homebrew/cask-drivers"

cask_args appdir: "/Applications"

# Binaries
brew "hugo"
brew "tmux"
brew "vim"

# Apps
cask "alacritty", args: { appdir: "~/Applications" }
cask "vlc"

Referências