2013-08-26 18 views
14

Mam instalację Homebrew w $HOME/brew, a historycznie to działało dobrze. Niestety, z biegiem czasu Homebrew stał się coraz mniej tolerancyjny dla instalacji spoza /usr/local. Różne formuły tworzą twarde założenia dotyczące prefiksu instalacji i nie działają poprawnie (tzn. Nie zostały przetestowane) z niestandardowym przedrostkiem. Komenda brew doctor idzie nawet tak daleko, aby ostrzec o tym teraz:Jak przeprowadzić migrację instalacji Homebrew do nowej lokalizacji?

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! 

Jako takie, chciałbym teraz migrować moje Homebrew instalację nad do /usr/local. Jednak nie lubię po prostu wszystkich plików, ponieważ podejrzewam, że spowoduje to problemy. Nie mogłem znaleźć żadnych instrukcji na stronie Homebrew lub tutaj podczas migracji istniejącej instalacji do nowego prefiksu. Oczywiście mógłbym uninstall Homebrew, a następnie zainstalować go ponownie, ale wolałbym nie odbudowywać wszystkich swoich beczek.

Czy istnieje jakiś skrypt lub udokumentowana praktyka wykonywania takiej migracji?

Czy jest to niemożliwe z powodu bezwzględnych ścieżek w połączonych plikach binarnych?

Odpowiedz

17

Nowoczesny sposób na zrobienie tego to homebrew-bundle.

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

To powinna być zaakceptowana odpowiedź. –

+0

@AdamMatan Cieszę się, że istnieje wbudowane rozwiązanie. Zmieniłem zaakceptowaną odpowiedź. – ctrueden

1

Czy jest to niemożliwe z powodu bezwzględnych ścieżek w połączonych plikach binarnych?

Rzeczywiście. Musisz ponownie zainstalować wszystko od nowa.

+0

Dzięki Peter, to ma sens. Przegłosowałem twoją odpowiedź. Ale napisałem też odpowiedź z bardziej szczegółowymi informacjami, jak złagodzić ból związany z ponowną instalacją, która, mam nadzieję, przyda się innym, więc zaakceptowałem ją. – ctrueden

1

Jako suggested by Peter Eisentraut, faktycznie zakończyłem migrację mojej instalacji Homebrew przez ponowną instalację. Można rzeczy skryptów nieco do retap wszystkie dodatkowe zawory i ponownie zainstalować wszystkie wcześniej zainstalowane beczek, bez zbyt dużo pracy ręcznej:

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

Oczywiście niestandardowe instalacje Homebrew będzie mieć dodatkowe zmarszczki. Na przykład, jeśli popełnione zmian w każdej z twoich Homebrew związanych repo Git, może chcesz importować, że praca przed ponownym swoich beczek lub wieje od starego instalację:

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 

pamiętać, że tylko przetestowane drugi fragment bardzo nisko, ponieważ osobiście nie dostosowałem mojego Homebrew w taki sposób.

Innym aspektem Homebrew, który nie jest adresowany przez to podejście, są niestandardowe flagi używane podczas oryginalnej instalacji. Na przykład, aby zainstalować wine, musisz zainstalować różne zależności za pomocą flagi --universal, a powyższy skrypt nie przeinstaluje ich z włączonymi takimi flagami. Zobacz odpowiedź @ xuhdev dla rozwiązania, które to robi.

15

Właśnie napisałem skrypt, aby osiągnąć cel migracji homebrew pakiety do nowego systemu, który ma zastosowanie również do przypadku (o nazwie 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' 

Najpierw należy uruchomić ten skrypt na oryginalnym systemie aby wygenerować skrypt Restore:

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

Następnie, po zainstalowaniu Homebrew na nowym systemie (w przypadku tego samego systemu), wystarczy uruchomić restore-homebrew.sh zainstalować wszystkie te pakiety, które mają na oryginalnym systemie.

Zaletą tego skryptu nad tym, który daje @ctrueden, jest to, że ten skrypt próbuje również wykonać kopię zapasową opcji instalacji użytych podczas instalacji pakietów.

Bardziej szczegółowy opis znajduje się w my blog.

+1

Świetny pomysł! W szczególności fakt, że instaluje ponownie te same opcje jest krytyczny, ponieważ z mojego doświadczenia wynika, że ​​skomplikowane instalacje Homebrew zawsze zawierają pakiety z flagami lub innymi. – ctrueden

+1

Ponieważ ta odpowiedź jest zarówno lepsza technicznie, jak i bardziej ogólna niż moja, teraz akceptuję tę odpowiedź. (Uznałem jednak, że czytelnikom nie udało się: nie testowałem osobiście skryptu, ponieważ moje osobiste problemy z Homebrew minęły.) – ctrueden

+0

@ctrueden Dzięki! Nie martw się, przetestowałem to sam. – xuhdev

Powiązane problemy