Ответ 1
Современный способ сделать это - homebrew-bundle.
brew tap Homebrew/bundle
brew bundle dump # Creates 'Brewfile' in the current directory
# later ...
brew bundle # Installs packages listed in 'Brewfile'
У меня есть 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 или документированная практика для выполнения такой миграции?
Или это невозможно из-за жестко закодированных абсолютных путей в связанных двоичных файлах?
Современный способ сделать это - homebrew-bundle.
brew tap Homebrew/bundle
brew bundle dump # Creates 'Brewfile' in the current directory
# later ...
brew bundle # Installs packages listed in 'Brewfile'
Я только что написал 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 также пытается создать резервные копии параметров установки, которые вы использовали при установке пакетов.
Более подробное описание находится в моем блоге.
Или это невозможно из-за жестко закодированных абсолютных путей в связанных двоичных файлах?
Действительно. Вам нужно будет переустановить все с нуля.
Как предложенный Питером Эйзентраутом, я действительно перестал переносить мою установку 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 для решения, которое делает это.