Dopo aver esaminato i comandi principali per usare Homebrew, è ora di trattare i principali comandi avanzati. Prima però un breve ripasso del post precedente.
Aggiornamento
Come abbiamo visto, per aggiornare Homebrew si usa la terna di comandi
$ brew update
che aggiorna il sistema Homebrew vero e proprio,
$ brew outdated
che elenca le nuove versioni disponibili dei package già installati nel sistema (Figura 1),
e infine
$ brew upgrade
che aggiorna i package installati alla versione più recente presente in Homebrew (Figura 2).
Se si vuole aggiornare solo uno o più package (magari perché si sa a priori che qualche aggiornamento contiene dei bachi o è incompatibile con altri software installati sul Mac)
$ brew upgrade package1 [package2 ...]
dove package1, package2, indicano i nomi dei package da aggiornare.
Versioni
Quando si aggiorna un package, Homebrew ne mantiene anche le versioni precedenti. Il comando
$ brew list --versions
elenca i package installati con i relativi numeri di versione. Se un package è stato già aggiornato, tutte le versioni presenti nel sistema sono mostrate sulla stessa riga (Figura 3).
Per mettere in evidenza i package di cui esistono versioni multiple si aggiunge una ulteriore opzione a brew list
che, sul Mac con una installazione relativamente recente di Homebrew che sto usando, riporta soltanto
$ brew list --versions --multiple
git 1.9.2 1.9.3
readline 6.3.3 6.3.5
Su un sistema più vissuto, la lista dei package in versioni multiple può diventare molto lunga (Figura 4).
Per rimuovere le vecchie versioni di un package, lasciando installata l’ultima versione
$ brew cleanup package
mentre per rimuovere in blocco le vecchie versioni di tutti i package installati
$ brew cleanup [-n]
dove l’opzione -n
serve ad eseguire un dry-run
, cioè mostra le operazioni che saranno svolte senza eseguirle realmente (Figura 5). Togliendo l’opzione -n
il sistema effettua la rimozione effettiva dei package più vecchi.
Disinstallazione
Per disinstallare un package, come abbiamo visto, si usa
$ brew remove package
oppure
$ brew uninstall package
che mi sembra più facile da ricordare.
Se sono presenti versioni multiple di un package, Homebrew disinstalla solo la versione più recente. Per rimuovere definitivamente un package di cui sono installate varie versioni è quindi consigliabile eseguire in sequenza
$ brew cleanup package
$ brew uninstall package
Quando si installano i package i file di installazione, sia in forma di sorgenti da compilare che di bottle precompilate, vengono salvati in una cartella ben definita, generalmente /Library/Caches/Homebrew
, detta la cache di Homebrew. Il percorso della cache viene riportato dal comando
$ brew --cache
/Library/Caches/Homebrew
Si noti fra parentesi che, se si racchiude un qualunque comando fra $(...)
, il Terminale (o meglio l’interprete dei comandi bash
) consente di usarne l’output come dato di ingresso di comandi successivi. Ad esempio, per elencare il contenuto della cache di Homebrew si può scrivere
$ ls -a /Library/Caches/Homebrew
oppure
$ ls -a $(brew --cache)
che è particolarmente comodo se si vogliono automatizzare determinate operazioni (Figura 6).
Una volta installato il package, i file di installazione dei package di Homebrew non sono più strettamente necessari (analogamente ai file .dmg che in OS X contengono nella maggior parte dei casi le applicazioni da installare) ed occupano inutilmente spazio sul disco rigido. Inoltre, soprattutto dopo installazioni fallite, si può voler rimuovere il file di installazione e scaricare una nuova versione pulita.
Per rimuovere dalla cache i file di installazione di uno o più package
$ rm -rf $(brew --cache package1 [package2 ...])
e per ripulire completamente la cache (naturalmente senza rimuovere i package installati)
$ rm -rf $(brew --cache)
Per programmatori
Un comando utile a chi ha esperienza di programmazione quando si installano nuovi package è
$ brew options package
che mostra le (eventuali) opzioni non standard di installazione di un determinato package. Ad esempio
$ brew options pandoc
non riporta nulla, mentre eseguendo
$ brew options git
si ottiene
--with-blk-sha1
ompile with the block-optimized SHA1 implementation
--with-brewed-curl
Use Homebrew's version of cURL library
--with-brewed-openssl
Build with Homebrew OpenSSL instead of the system version
--with-gettext
Build with gettext support
--with-pcre
Build with pcre support
--with-persistent-https
Build git-remote-persistent-https from "contrib" directory
--without-completions
Disable bash/zsh completions from "contrib" directory
--devel
install development version 2.0.0.rc3
--HEAD
install HEAD version
Se si sa esattamente cosa si sta facendo, una o più di queste opzioni possono essere inserite nel comando di installazione del package, che verrà compilato con le opzioni prescelte e non con quelle di default. Ad esempio
$ brew install --with-brewed-openssl git
compila git
usando la libreria OpenSSL – che tanto ha fatto parlare di sé negli ultimi tempi – contenuta in Homebrew e non quella installata in OS X (che è comunque immune all’Heartbleed Bug).
Il comando brew list
seguito dal nome di un package
$ brew list [--verbose] package
elenca i file e le cartelle installati da quel package
$ brew list pandoc
/usr/local/Cellar/pandoc/1.12.3/bin/pandoc
/usr/local/Cellar/pandoc/1.12.3/etc/bash_completion.d/pandoc-completion.bash
/usr/local/Cellar/pandoc/1.12.3/share/doc/x86_64-osx-ghc-7.6.3/pandoc-1.12.3/COPYING
/usr/local/Cellar/pandoc/1.12.3/share/man/ (2 files)
/usr/local/Cellar/pandoc/1.12.3/share/x86_64-osx-ghc-7.6.3/ (38 files)
e, con l’opzione --verbose
, mostra i file contenuti in tutte le cartelle installate (l’elenco può essere davvero molto lungo).
Formule
In tutti i miei post su Homebrew ho volutamente preferito usare il termine package
invece di formula
, come è più usuale in Homebrew e come si troverà scritto in tutta la documentazione disponibile.
Un package
indica infatti il programma che vogliamo installare, mentre la formula
è la serie di comandi usati da Homebrew per installarlo, scritta in Ruby. In Homebrew i due significati si confondono, ma secondo me è più comprensibile mantenerli distinti.
Se siamo curiosi di sapere come è fatta la formula
di un package
di Homebrew
$ brew cat package
Ad esempio
$ brew cat pandoc
mostra la formula che serve a compilare ed installare il solito pandoc
(Figura 7).
Quello che fa questa formula è abbastanza evidente, anche senza conoscere Ruby o altri linguaggi di programamzione.
Ed è questa un’altra caratteristica utile di Homebrew: rende la vita facile non solo a chi si limita ad installare i package, ma anche agli sviluppatori che si occupano di prepararli.
Uno degli aspetti che approfondiremo prossimamente.