Краткое объяснение: rbenv работает путем подключения к вашей среде PATH
. Концепция проста, но дьявол кроется в деталях; полный совок ниже.
Во- первых, rbenv создает регулировочные шайбы для всех команд ( ruby
, irb
, rake
, gem
и т.д.) во всех установленных версий Ruby. Этот процесс называется перефразированием . Каждый раз, когда вы устанавливаете новую версию Ruby или гем, который предоставляет команду, запускайте, rbenv rehash
чтобы убедиться, что все новые команды объединены оболочкой.
Эти прокладки находятся в одном каталоге ( ~/.rbenv/shims
по умолчанию). Чтобы использовать rbenv, вам нужно только добавить каталог прокладок в начало PATH
:
export PATH="$HOME/.rbenv/shims:$PATH"
Затем всякий раз, когда вы запускаете ruby
из командной строки или запускаете сценарий, который читает shebang #!/usr/bin/env ruby
, ваша операционная система ~/.rbenv/shims/ruby
сначала найдет и запустит его вместо любого другого ruby
исполняемого файла, который вы могли установить.
Каждая прокладка - это крошечный сценарий Bash, который, в свою очередь, выполняется rbenv exec
. Таким образом, если на вашем пути irb
есть rbenv, это эквивалентно rbenv exec irb
и ruby -e "puts 42"
эквивалентно rbenv exec ruby -e "puts 42"
.
Команда rbenv exec
определяет, какую версию Ruby вы хотите использовать, а затем запускает соответствующую команду для этой версии. Вот как:
- Если
RBENV_VERSION
переменная среды установлена, ее значение определяет версию Ruby для использования.
- Если в текущем рабочем каталоге есть
.rbenv-version
файл, его содержимое используется для установки RBENV_VERSION
переменной среды.
- Если
.rbenv-version
в текущем каталоге нет файла, rbenv ищет файл в каждом родительском каталоге, .rbenv-version
пока не попадет в корень вашей файловой системы. Если он найден, его содержимое используется для установки RBENV_VERSION
переменной среды.
- Если
RBENV_VERSION
по-прежнему не установлен, rbenv пытается установить его, используя содержимое ~/.rbenv/version
файла.
- Если версия нигде не указана, rbenv предполагает, что вы хотите использовать «системный» Ruby, т.е. какую бы версию ни запустили, если бы rbenv не было на вашем пути.
(Вы можете установить версию Ruby для конкретного проекта с помощью rbenv local
команды, которая создает .rbenv-version
файл в текущем каталоге. Точно так же rbenv global
команда изменяет ~/.rbenv/version
файл.)
Вооружившись RBENV_VERSION
переменной окружения, rbenv добавляет ~/.rbenv/versions/$RBENV_VERSION/bin
в начало вашего файла PATH
, затем выполняет команду и переданные аргументы rbenv exec
. Вуаля!
Чтобы полностью понять, что именно происходит под капотом, попробуйте установить RBENV_DEBUG=1
и запустить команду Ruby. Каждая команда Bash, запускаемая rbenv, будет записана в ваш терминал.
Сейчас rbenv занимается только переключением версий, но процветающая экосистема плагинов поможет вам сделать все, от установки Ruby до настройки вашей среды , управления «гемсетами» и даже автоматизацииbundle exec
.
Я не совсем уверен, какое отношение имеет поддержка IRC к переключению версий Ruby, а rbenv разработан, чтобы быть достаточно простым и понятным, чтобы не требовать поддержки. Но если вам когда-нибудь понадобится помощь, средство отслеживания проблем и Twitter находятся всего в паре кликов.
Раскрытие информации: я являюсь автором rbenv, ruby-build и rbenv-vars.