6 minutos
Gerenciando pacotes no macOS com Homebrew
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:
- Software como bundle (.app) no macOS: uma introdução ao que são os apps (bundles) no macOS;
- rpath no macOS: Explica como os apps (bundles) auto suficientes gerenciam suas dependências internas e como o RPATH funciona no macOS
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"