Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do you migrate a Homebrew installation to a new location?

Tags:

homebrew

I have a Homebrew installation in $HOME/brew, and historically it has worked well. Unfortunately, over time Homebrew has become less and less tolerant of installations outside of /usr/local. Various formulae make hard assumptions about the installation prefix, and do not work properly (i.e., were not tested) with a non-standard prefix. The brew doctor command even goes so far as to warn about this now:

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!

As such, I would now like to migrate my Homebrew installation over to /usr/local. However, I am loath to simply mv all the files, as I suspect this will cause problems. I could not find any instructions on the Homebrew site or here on migrating an existing installation to a new prefix. Of course, I could uninstall Homebrew and then reinstall it, but I would prefer not to rebuild all my kegs.

Is there any existing script or documented practice for performing such a migration?

Or is this impossible due to hardcoded absolute paths in linked binaries?

like image 247
ctrueden Avatar asked Aug 26 '13 16:08

ctrueden


People also ask

Where does Homebrew install bins?

By default, Homebrew will install all packages in the directory /usr/local/Cellar/ , and also creates symbolic links at /usr/local/opt/ and /usr/local/bin/ (for executable files).

How does Homebrew install work?

Just like cargo build && cargo run creates a binary, stores it in a predictable location, and executes it, Homebrew creates executables and installs them into a predictable location for your computer to execute later.


2 Answers

The modern way to do this is with homebrew-bundle.

brew tap Homebrew/bundle brew bundle dump # Creates 'Brewfile' in the current directory # later ... brew bundle # Installs packages listed in 'Brewfile' 
like image 170
Wedgwood Avatar answered Oct 14 '22 18:10

Wedgwood


I just wrote a script to achieve the goal to migrate homebrew packages to a new system, which also applies for your case (named 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 --formula | 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'

You should first run this script on your original system to generate a restore script:

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

Then, after installing Homebrew on your new system (in your case the same system), simply run restore-homebrew.sh to install all those packages you have on your original system.

The benefits of this script over the one given by @ctrueden is that this script also tries to back up the installation options you used when you installed the packages.

A more detailed description is in my blog.

like image 25
xuhdev Avatar answered Oct 14 '22 17:10

xuhdev