Comment dois-je réparer mon installation Homebrew après la mise à niveau d'OS X?

25

Le contexte

Mon employeur m'a donné un MacBook Pro pour les travaux de développement; cependant, la plupart du travail de développement que je fais dans mon groupe de recherche concerne les plates-formes Linux et pour de nombreuses raisons de politique, je ne peux pas installer de logiciel de virtualisation sur cet ordinateur portable. Homebrew semble être un bon moyen d'installer ces outils, en particulier parce qu'il semble très piratable (car il utilise Ruby; MacPorts ne semble pas piratable, car il utilise Tcl). Cependant, Homebrew s'appuie sur les bibliothèques système et, pour des raisons de sécurité, mon employeur peut (et d'après ce que j'entends souvent) mettre à niveau mon système à tout moment. J'ai entendu dire que les mises à niveau d'OS X briseraient Homebrew. (Voir, par exemple, /programming/7779300/how-should-i-upgrade-xcode-after-upgrading-to-os-x-lion ).

Question

Comment pourrais-je réparer mon installation de Homebrew après une mise à niveau d'OS X? Je suis d'accord pour le supprimer et recommencer à zéro, tant que je peux le faire de manière automatisée. (Par exemple, en utilisant Puppet plus un fournisseur Homebrew pour créer un script d'une configuration qui s'appuiera automatiquement sur l'exécution d'un script shell.) J'ai fait des recherches sur Google partout et je n'arrive pas à trouver de réponses à cette question.

Geoff Oxberry
la source

Réponses:

8
brew update

Met à jour l'installation de Homebrew. S'il y a des erreurs, elles doivent être signalées par brew doctor. Essayez de les réparer autrement, vous pouvez utiliser le script de désinstallation comme suit:

#!/bin/sh
# Just copy and paste the lines below (all at once, it won't work line by line!)
# MAKE SURE YOU ARE HAPPY WITH WHAT IT DOES FIRST! THERE IS NO WARRANTY!

function abort {
  echo "$1"
  exit 1
}

set -e

/usr/bin/which -s git || abort "brew install git first!"
test -d /usr/local/.git || abort "brew update first!"

cd `brew --prefix`
git checkout master
git ls-files -z | pbcopy
rm -rf Cellar
bin/brew prune
pbpaste | xargs -0 rm
rm -r Library/Homebrew Library/Aliases Library/Formula Library/Contributions
test -d Library/LinkedKegs && rm -r Library/LinkedKegs
rmdir -p bin Library share/man/man1 2> /dev/null
rm -rf .git
rm -rf ~/Library/Caches/Homebrew
rm -rf ~/Library/Logs/Homebrew
rm -rf /Library/Caches/Homebrew

Et réinstallez homebrew. Suis presque sûr que tout cela est configurable à l'aide de marionnettes.

Gaurav Agarwal
la source
7

Je pense que vous vous demandez peut-être si vous devez reconstruire tous les packages plutôt que de simplement désinstaller. Si tel est le cas, je comprends que ce n'est généralement pas un problème, comme le dit cette réponse .

J'ai eu des problèmes, en particulier lors du passage à OS X Mavericks et Xcode 5, j'ai dû reconnecter tous les packages que j'avais installés - voici mon script:

#!/bin/bash
FORMULAS=(`brew list`);
for FORMULA in "${FORMULAS[@]}"
do 
    echo "brew unlink $FORMULA" && echo "brew link $FORMULA";
    OUTPUT=`brew unlink $FORMULA`;
    echo $OUTPUT;
    OUTPUT=`brew link $FORMULA`;
    echo $OUTPUT;
done

Notez la sortie, certaines formules nécessiteront --forcel' linkétape.

Si cela ne fonctionne toujours pas, essayez cette série de commandes de Mike McQuaid :

brew list > brew-list.txt
brew uninstall $(cat brew-list.txt)
brew install $(cat brew-list.txt)

Il existe maintenant une rebuildcommande dans HomeBrew, mais cela ne résout pas actuellement les dépendances.

sventechie
la source
1
J'ai fait une installation propre de Mavericks sur mon nouveau Mac et après cela, j'ai restauré une sauvegarde Time Machine de mon autre Mac. Il a laissé l'ordinateur avec tout installé, y compris Homebrew et ses formules, mais tous n'étaient pas liés. J'ai utilisé le script pour relier toutes les formules à la fois et le corriger! Fonctionne comme un charme, merci.
Alejandro García Iglesias
1
Dans un problème connexe, j'ai dû dégager / toucher tous les robinets, sinon brew ne trouverait pas de formules même s'il affirmait que le bon robinet avait déjà été tapé. for tap in $(brew tap); do brew untap "$tap"; brew tap "$tap"; done
Joel Purra