2013-08-26 6 views
14

Ho un'installazione Homebrew in $HOME/brew e storicamente ha funzionato bene. Sfortunatamente, nel tempo, Homebrew è diventato sempre meno tollerante per le installazioni al di fuori di /usr/local. Varie formule fanno assunzioni sul prefisso di installazione e non funzionano correttamente (cioè non sono state testate) con un prefisso non standard. Il comando brew doctor si spinge fino al punto di mettere in guardia su questo ora:Come si esegue la migrazione di un'installazione Homebrew in una nuova posizione?

Warning: Your Homebrew is not installed to /usr/local 
You can install Homebrew anywhere you want, but some brews may only build 
correctly if you install in /usr/local. Sorry! 

Come tale, vorrei ora di migrare la mia installazione Homebrew verso /usr/local. Tuttavia, sono riluttante a semplicemente mv tutti i file, come sospetto che ciò causerà problemi. Non sono riuscito a trovare alcuna istruzione sul sito Homebrew o qui sulla migrazione di un'installazione esistente a un nuovo prefisso. Certo, potrei uninstall Homebrew e quindi reinstallarlo, ma preferirei non ricostruire tutti i miei keg.

Esiste uno script esistente o pratica documentata per eseguire tale migrazione?

Oppure è impossibile a causa di percorsi assoluti codificati nei binari collegati?

risposta

17

Il modo moderno per farlo è con homebrew-bundle.

brew tap Homebrew/bundle 
brew bundle dump # Creates 'Brewfile' in the current directory 
# later ... 
brew bundle # Installs packages listed in 'Brewfile' 
+0

Questa dovrebbe essere la risposta accettata. –

+0

@AdamMatan Sono contento di vedere che ora esiste una soluzione integrata. Ho cambiato la risposta accettata. – ctrueden

1

Oppure è impossibile a causa di percorsi assoluti codificati nei binari collegati?

Infatti. Dovrai reinstallare tutto da zero.

+0

Grazie Peter, ha senso. Ho upvoted la tua risposta. Ma ho anche scritto una risposta con maggiori dettagli su come alleviare il dolore della reinstallazione, che spero possa essere utile agli altri, quindi ho accettato quella invece. – ctrueden

1

Come suggested by Peter Eisentraut, ho effettivamente terminato la migrazione della mia installazione Homebrew reinstallandola. È possibile cose di script un po 'per Retap tutti i rubinetti in più, e reinstallare tutti i fusti installati in precedenza, senza troppo lavoro manuale:

#!/bin/sh 

# save list of kegs for later reinstallation 
brew list > kegs.txt 

# back up old Homebrew installation 
mv $HOME/brew $HOME/old-brew 

# install Homebrew into /usr/local 
ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go)" 

# retap all the taps 
# NB: It is not enough to move the tap repos to their new location, 
# because Homebrew will not automatically recognize the new formulae. 
# There might be a configuration file we could edit, but rather than 
# risk an incomplete data structure, let's just retap everything. 
for tapDir in $HOME/old-brew/Library/Taps/* 
do (
    cd $tapDir 
    tap=$(git remote -v | \ 
    grep '(fetch)' | \ 
    sed 's/.*github.com\///' | \ 
    sed 's/ (fetch)//') 
    /usr/local/bin/brew tap $tap 
) done 

# reinstall all the kegs 
/usr/local/bin/brew install $(cat kegs.txt) 

# much later... ;-) 
rm -rf kegs.txt $HOME/old-brew 

Naturalmente, installazioni personalizzate Homebrew avranno le rughe aggiuntivi. Ad esempio, se hai commesso modifiche a uno qualsiasi dei vostri pronti contro termine di Git Homebrew-correlati, si consiglia di importare che il lavoro prima di reinstallare i tuoi fusti o soffiando via la vostra vecchia installazione:

cd /usr/local 
for f in $(find . -name '.git') 
do (
    repoDir=$(dirname $f) 
    cd $f/.. 
    git remote add old-brew-$f $(dirname $HOME/old-brew/$f/..) 
    git fetch old-brew-$f 
) done 

Si noti che ho provato solo la seconda frammento sopra molto leggermente, come personalmente non ho personalizzato il mio Homebrew in questo modo.

Un altro aspetto di Homebrew non affrontato da questo approccio è rappresentato da flag personalizzati durante l'installazione originale. Ad esempio, per installare wine è necessario installare varie dipendenze con il flag --universal e lo script sopra non le reinstallerà con tali flag abilitati. Vedi la risposta a @ xuhdev per una soluzione che lo faccia.

15

ho appena scritto uno script per raggiungere l'obiettivo di migrare i pacchetti homebrew per un nuovo sistema, che si applica anche per il vostro caso (denominato backup-homebrew.sh):

#!/bin/bash 

echo '#!/bin/bash' 
echo '' 
echo 'failed_items=""' 
echo 'function install_package() {' 
echo 'echo EXECUTING: brew install $1 $2' 
echo 'brew install $1 $2' 
echo '[ $? -ne 0 ] && $failed_items="$failed_items $1" # package failed to install.' 
echo '}' 

brew tap | while read tap; do echo "brew tap $tap"; done 

brew list | while read item; 
do 
    echo "install_package $item '$(brew info $item | /usr/bin/grep 'Built from source with:' | /usr/bin/sed 's/^[ \t]*Built from source with:/ /g; s/\,/ /g')'" 
done 

echo '[ ! -z $failed_items ] && echo The following items were failed to install: && echo $failed_items' 

Si dovrebbe prima eseguire questo script sul vostro sistema originale per generare uno script di ripristino:

./backup-homebrew.sh >restore-homebrew.sh && chmod +x restore-homebrew.sh 

Poi, dopo l'installazione Homebrew sul vostro nuovo sistema (nel tuo caso lo stesso sistema), è sufficiente eseguire restore-homebrew.sh per installare tutti quei pacchetti che hai sul tuo sistema originale.

I vantaggi di questo script rispetto a quello fornito da @ctrueden è che questo script tenta anche di eseguire il backup delle opzioni di installazione utilizzate durante l'installazione dei pacchetti.

Una descrizione più dettagliata è in my blog.

+1

Ottima idea! In particolare, il fatto che venga reinstallato con le stesse opzioni è fondamentale, poiché nella mia esperienza, le installazioni Homebrew complesse hanno sempre alcuni pacchetti con alcune bandiere o altro. – ctrueden

+1

Poiché questa risposta è sia tecnicamente superiore che più generale della mia, ora ho accettato questa risposta. (Caveat emptor ai lettori, però: non ho personalmente testato la sceneggiatura, dato che i miei problemi personali in Homebrew sono finiti.) – ctrueden

+0

@ctrueden Grazie! Non ti preoccupare, l'ho provato io stesso. – xuhdev

Problemi correlati