Подтвердить что ты не робот

Как переносить установку Homebrew в новое место?

У меня есть Homebrew установка в $HOME/brew, и исторически это сработало хорошо. К сожалению, со временем Homebrew стал все менее и менее терпимым к установкам вне /usr/local. Различные формулы делают жесткие предположения о префиксе установки и не работают должным образом (т.е. Не тестировались) с нестандартным префиксом. Команда brew doctor даже до сих пор предупреждает об этом:

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!

Таким образом, теперь я хотел бы перенести мою установку Homebrew на /usr/local. Тем не менее, я не могу просто mv всех файлов, так как я подозреваю, что это вызовет проблемы. Я не мог найти никаких инструкций на сайте Homebrew или здесь при переносе существующей установки на новый префикс. Конечно, я мог бы удалить Homebrew, а затем переустановить его, но я бы предпочел не перестраивать все мои бочонки.

Существует ли какая-либо существующая script или документированная практика для выполнения такой миграции?

Или это невозможно из-за жестко закодированных абсолютных путей в связанных двоичных файлах?

4b9b3361

Ответ 1

Современный способ сделать это - homebrew-bundle.

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

Ответ 2

Я только что написал script для достижения цели переноса пакетов homebrew в новую систему, которая также применяется для вашего случая (с именем 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'

Сначала вы должны запустить этот script в своей исходной системе, чтобы создать восстановление script:

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

Затем, после установки Homebrew в вашей новой системе (в вашей же системе), просто запустите restore-homebrew.sh, чтобы установить все те пакеты, которые у вас есть в исходной системе.

Преимущества этого script по сравнению с данными, приведенными в @ctrueden, состоят в том, что этот script также пытается создать резервные копии параметров установки, которые вы использовали при установке пакетов.

Более подробное описание находится в моем блоге.

Ответ 3

Или это невозможно из-за жестко закодированных абсолютных путей в связанных двоичных файлах?

Действительно. Вам нужно будет переустановить все с нуля.

Ответ 4

Как предложенный Питером Эйзентраутом, я действительно перестал переносить мою установку Homebrew, переустановив ее. Вы можете script немного пополнить все свои дополнительные краны и переустановить все ваши ранее установленные бочонки, не затрачивая слишком много ручной работы:

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

Конечно, индивидуальные установки Homebrew будут иметь дополнительные морщины. Например, если вы внесли изменения в какой-либо из ваших репозиторий Git, связанных с Homebrew, вы можете захотеть импортировать эту работу, прежде чем переустанавливать бочонки или сбрасывать старую установку:

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

Обратите внимание, что я только проверял второй фрагмент выше очень легко, так как лично я не настроил свой Homebrew таким образом.

Другим аспектом Homebrew, который не рассматривается в этом подходе, являются пользовательские флаги, используемые во время вашей первоначальной установки. Например, для установки wine вам необходимо установить различные зависимости с флагом --universal, а приведенный выше script не будет переустанавливать их с включенными такими флагами. См. Ответ @xuhdev для решения, которое делает это.