2013-08-26 16 views
14

Homebrew$HOME/brewにインストールされていますが、歴史的にはうまくいきました。残念なことに、自宅の時間がたつにつれて、/usr/local以外の設備の使用はますます寛容になっています。様々な公式は、インストールプレフィックスについて厳しい仮定をし、非標準プレフィックスを用いて正しく動作しない(すなわち、テストされなかった)。 brew doctorコマンドも、これまでのところ、今このことについて警告するようになり:Homebrewインストールを新しい場所にどのように移行しますか?

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! 

そのように、私は今/usr/localに上で、私の自作のインストールを移行したいと思います。しかし、私は単純にmvすべてのファイルに嫌が、私はこれが問題を引き起こすと思われる。 Homebrewサイトまたは既存のインストールを新しいプレフィックスに移行する際に、私は指示を見つけることができませんでした。もちろん、私はuninstall Homebrewにして再インストールすることができますが、私はすべてのkegを再構築したくないです。

このような移行を実行するための既存のスクリプトまたは文書化されたプラクティスはありますか?

リンクバイナリの絶対パスがハードコードされているため、これは不可能ですか?

答えて

17

これを行う現代的な方法は、homebrew-bundleです。

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

これは受け入れられる回答でなければなりません。 –

+0

@AdamMatan組み込みのソリューションが現在存在していることを嬉しく思います。私は受け入れられた答えを変更しました。 – ctrueden

1

リンクバイナリの絶対パスがハードコードされているため、これは不可能ですか?

実際。最初からすべてを再インストールする必要があります。

+0

感謝のピーター、それは意味があります。私はあなたの答えをupvoted。しかし、私はまた、再インストールの苦痛を和らげる方法の詳細についても答えを書いてくれました。私は他人にとって有益だと思っています。 – ctrueden

1

suggested by Peter Eisentrautとなってしまいましたが、実際にホームブリューのインストールを再インストールして移行しました。あなたは、スクリプトの事が少しはあまりにも多くのマニュアル作業をせずに、すべての余分なタップをretap、およびすべての以前にインストールされた樽を再インストールすることができます。

もちろん
#!/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 

、カスタマイズされた自作のインストールでは、追加のしわを持っています。たとえば、あなたの自作関連のGitのリポジトリのいずれかに変更をコミットした場合、あなたはあなたの樽を再インストールしたり、古いインストールを吹き飛ばす前にその仕事をインポートすることもできます。私は唯一の第二のテスト

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のもう1つの側面は、元のインストール時に使用していたカスタムフラグです。たとえば、wineをインストールするには、--universalフラグを使用してさまざまな依存関係をインストールする必要があります。上記のスクリプトでは、このようなフラグを有効にして再インストールしません。そうする解決策については、@ xuhdevの回答を参照してください。

15

私はちょうど(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' 

あなたが最初にあなたの元のシステム上でこのスクリプトを実行する必要があります復元スクリプトを生成する。そして、

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

を、あなたの新しいシステム(あなたのケースでは、同じシステム)上で自作をインストールした後、単にあなたがあなたの元のシステムにあるすべてのこれらのパッケージをインストールするrestore-homebrew.shを実行します。

このスクリプトの利点は、このスクリプトがパッケージのインストール時に使用したインストールオプションをバックアップしようとすることです。

さらに詳しい説明はmy blogです。

+1

素晴らしいアイデア!特に、同じオプションで再インストールするという事実は、私の経験では、複雑な自作インストールでは常にいくつかのフラグやその他のパッケージが含まれているため、非常に重要です。 – ctrueden

+1

この回答は技術的に優れており、私よりも一般的なので、私は今この回答を受け入れました。 (私の個人的なホームブルードの悲しみが終わって以来、私は個人的にスクリプトをテストしていませんでした。) – ctrueden

+0

@ctruedenありがとう!心配しないで、私はそれを自分でテストしました。 – xuhdev

関連する問題