2013-08-26 5 views
14

Ich habe eine Homebrew Installation in $HOME/brew, und historisch hat es gut funktioniert. Leider ist Homebrew im Laufe der Zeit immer weniger tolerant gegenüber Installationen außerhalb von /usr/local geworden. Verschiedene Formeln treffen harte Annahmen über das Installationspräfix und funktionieren nicht ordnungsgemäß (d. H. Wurden nicht getestet) mit einem nicht standardmäßigen Präfix. Der brew doctor Befehl geht sogar so weit, jetzt darüber zu warnen:Wie migriert man eine Homebrew-Installation an einen neuen Ort?

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! 

Als solche habe ich nun meine Homebrew Installation über /usr/local migrieren möchten. Allerdings bin ich einfach zu mv alle Dateien abschrecken, da ich vermute, dass dies zu Problemen führen wird. Ich konnte keine Anweisungen auf der Homebrew-Site oder hier bei der Migration einer vorhandenen Installation zu einem neuen Präfix finden. Natürlich könnte ich uninstall Homebrew und dann neu installieren, aber ich würde es vorziehen, nicht alle meine Kegs neu zu erstellen.

Gibt es ein vorhandenes Skript oder eine dokumentierte Vorgehensweise für die Durchführung einer solchen Migration?

Oder ist dies aufgrund von fest codierten absoluten Pfaden in verknüpften Binärdateien unmöglich?

Antwort

17

Der moderne Weg dies zu tun ist mit homebrew-bundle.

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

Dies sollte die akzeptierte Antwort sein. –

+0

@AdamMatan Schön zu sehen, dass jetzt eine integrierte Lösung existiert. Ich habe die angenommene Antwort geändert. – ctrueden

1

Oder ist dies aufgrund von fest codierten absoluten Pfaden in verknüpften Binärdateien unmöglich?

In der Tat. Sie müssen alles von Grund auf neu installieren.

+0

Danke Peter, das macht Sinn. Ich habe deine Antwort erneuert. Aber ich schrieb auch eine Antwort mit mehr Details darüber, wie man den Schmerz der Neuinstallation lindern kann, was hoffentlich für andere nützlich sein wird, also habe ich das stattdessen akzeptiert. – ctrueden

1

Als suggested by Peter Eisentraut, tatsächlich migriert ich meine Homebrew-Installation durch Neuinstallation. Sie können Skript Dinge ein bisschen all Ihre persönlichen Taps Retap, und installieren Sie alle Ihre zuvor installierten Kegs, ohne zu viel Handarbeit:

#!/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 

Natürlich angepasst Homebrew-Installationen zusätzliche Falten haben. Zum Beispiel, wenn Sie Änderungen an Ihrer Homebrew bezogenen Git repos begangen haben, können Sie diese Arbeit importieren, bevor Sie Ihre Kegs oder weggeblasen alte Installation neu zu installieren:

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 

Beachten Sie, dass ich getestet nur die zweiten Schnipsel oben sehr leicht, da ich persönlich meinen Homebrew nicht so angepasst habe.

Ein weiterer Aspekt von Homebrew, der von diesem Ansatz nicht angesprochen wird, sind benutzerdefinierte Flags, die während der ursprünglichen Installation verwendet werden. Um beispielsweise wine zu installieren, müssen Sie verschiedene Abhängigkeiten mit dem Flag --universal installieren, und das obige Skript wird sie bei aktivierten Flags nicht erneut installieren. Siehe @ xuhdevs Antwort für eine Lösung, die dies tut.

15

Ich schrieb ein Skript, das Ziel zu erreichen Homebrew-Pakete zu einem neuen System zu migrieren, die auch für Ihren Fall gilt (mit dem Namen 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' 

Sie sollten zuerst das Skript auf Ihrem ursprünglichen System laufen

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

Dann, nach der Installation von Homebrew auf dem neuen System (in Ihrem Fall das gleiche System), einfach restore-homebrew.sh laufen die Pakete alles, was Sie auf Ihrem ursprünglichen System zu installieren: ein Skript wiederherstellen zu erzeugen.

Die Vorteile dieses Skripts gegenüber denen von @ctrueden sind, dass dieses Skript auch versucht, die Installationsoptionen zu sichern, die Sie bei der Installation der Pakete verwendet haben. Eine genauere Beschreibung ist in my blog.

+1

Tolle Idee! Insbesondere die Tatsache, dass es mit denselben Optionen neu installiert wird, ist kritisch, da nach meiner Erfahrung komplexe Homebrew-Installationen immer einige Pakete mit einigen Flags oder anderen haben. – ctrueden

+1

Da diese Antwort sowohl technisch überlegen als auch allgemeiner ist als meine, habe ich diese Antwort stattdessen akzeptiert. (Achtung, Leser: Ich habe das Skript nicht persönlich getestet, da meine persönlichen Homebrew-Probleme vorüber sind.) – ctrueden

+0

@ctrueden Danke! Mach dir keine Sorgen, ich habe es selbst getestet. – xuhdev

Verwandte Themen