101 lines
3.2 KiB
Bash
Executable File
101 lines
3.2 KiB
Bash
Executable File
# Setup Ruby environment: version managers (rbenv, chruby, rvm), Homebrew Ruby, and gem bin paths
|
|
_setup_ruby() {
|
|
[ -n "$ZSH_VERSION" ] && setopt localoptions nonomatch nullglob
|
|
|
|
_add_to_path() {
|
|
[ -d "$1" ] || return 0
|
|
case ":$PATH:" in
|
|
*":$1:"*) ;;
|
|
*) PATH="$1:$PATH"; export PATH ;;
|
|
esac
|
|
}
|
|
|
|
_ruby_manager_active=0
|
|
|
|
# 1. Check for rbenv (prefer managed Ruby)
|
|
if [ -d "$HOME/.rbenv/bin" ]; then
|
|
_add_to_path "$HOME/.rbenv/bin"
|
|
fi
|
|
if command -v rbenv >/dev/null 2>&1; then
|
|
eval "$(rbenv init - 2>/dev/null)"
|
|
_ruby_manager_active=1
|
|
|
|
# Fast OpenSSL detection for ruby-build without calling slow `brew --prefix`
|
|
if [ -z "$RUBY_CONFIGURE_OPTS" ]; then
|
|
for _ssl_dir in \
|
|
"/opt/homebrew/opt/openssl@3" \
|
|
"/opt/homebrew/opt/openssl@1.1" \
|
|
"/usr/local/opt/openssl@3" \
|
|
"/usr/local/opt/openssl@1.1"
|
|
do
|
|
if [ -d "$_ssl_dir" ]; then
|
|
export RUBY_CONFIGURE_OPTS="--with-openssl-dir=$_ssl_dir"
|
|
break
|
|
fi
|
|
done
|
|
fi
|
|
fi
|
|
|
|
# 2. Check for chruby
|
|
if [ "$_ruby_manager_active" -eq 0 ]; then
|
|
for _chruby_sh in \
|
|
"/opt/homebrew/opt/chruby/share/chruby/chruby.sh" \
|
|
"/usr/local/share/chruby/chruby.sh" \
|
|
"/usr/share/chruby/chruby.sh"
|
|
do
|
|
if [ -r "$_chruby_sh" ]; then
|
|
\. "$_chruby_sh"
|
|
[ -r "${_chruby_sh%/*}/auto.sh" ] && \. "${_chruby_sh%/*}/auto.sh"
|
|
_ruby_manager_active=1
|
|
break
|
|
fi
|
|
done
|
|
fi
|
|
|
|
# 3. Check for RVM
|
|
if [ "$_ruby_manager_active" -eq 0 ]; then
|
|
if [ -s "$HOME/.rvm/scripts/rvm" ]; then
|
|
\. "$HOME/.rvm/scripts/rvm"
|
|
_ruby_manager_active=1
|
|
fi
|
|
fi
|
|
|
|
# 4. If no version manager is active, fallback to Homebrew keg-only Ruby or standard locations
|
|
# (Avoids Apple's deprecated /usr/bin/ruby on macOS when Homebrew Ruby is installed)
|
|
if [ "$_ruby_manager_active" -eq 0 ]; then
|
|
for _brew_ruby in $(
|
|
for _r in /opt/homebrew/opt/ruby/bin \
|
|
/opt/homebrew/opt/ruby@*/bin \
|
|
/usr/local/opt/ruby/bin \
|
|
/usr/local/opt/ruby@*/bin; do
|
|
[ -x "$_r/ruby" ] && echo "$_r"
|
|
done | sort -V -r 2>/dev/null
|
|
); do
|
|
_add_to_path "$_brew_ruby"
|
|
break
|
|
done
|
|
fi
|
|
|
|
# 5. Add user gem binaries to PATH (dynamically resolved, not hardcoded to a fixed version)
|
|
if command -v ruby >/dev/null 2>&1; then
|
|
_gem_user_bin="$(ruby -e 'puts Gem.user_dir' 2>/dev/null)/bin"
|
|
if [ -n "$_gem_user_bin" ] && [ -d "$_gem_user_bin" ]; then
|
|
_add_to_path "$_gem_user_bin"
|
|
fi
|
|
unset _gem_user_bin
|
|
|
|
for _gbin in $(
|
|
for _gd in "$HOME/.gem/ruby"/*/bin "$HOME/.local/share/gem/ruby"/*/bin; do
|
|
[ -d "$_gd" ] && echo "$_gd"
|
|
done | sort -V -r 2>/dev/null
|
|
); do
|
|
_add_to_path "$_gbin"
|
|
break
|
|
done
|
|
fi
|
|
|
|
unset _ruby_manager_active
|
|
}
|
|
_setup_ruby
|
|
unset -f _setup_ruby _add_to_path
|