Как изменить, какую версию Ruby я использую

#ruby #homebrew

#ruby #homebrew

Вопрос:

Мне нужно запустить 2.5.3. Я использую brew для управления установкой ruby (поскольку я не смог заставить rvm работать на моей машине). Когда я запускаю

 $ruby -v
  

Я получаю

 ruby 2.3.7p456 (2018-03-28 revision 63024) [universal.x86_64-darwin18]
  

Однако, когда я пытаюсь обновить его с помощью

 brew upgrade ruby
  

Я получаю

 Error: ruby 2.6.1 already installed
  

Почему так непоследовательно, какую версию ruby я действительно установил?

Комментарии:

1. По-видимому, у вас есть и то, и другое. which ruby , ls -l $(which ruby) и echo $PATH должны дать некоторое представление.

Ответ №1:

Вы должны использовать менеджер версий Ruby для управления несколькими версиями Ruby. Я предпочитаю использовать rbenv. Ниже приведены шаги по его установке на Mac (они подробно объясняются о том, что делается и почему; если вам нужен ярлык, попробуйте выполнить все команды последовательно, но я все равно настаиваю, чтобы вы ознакомились с шагами).

rbenv

Прежде чем приступить к фактической установке, запомните эти пункты:

  1. rbenv само по себе не включает в себя возможность установки версий ruby. Это изменяет только версию ruby для каждого каталога. Для установки rubies вам необходимо установить инструмент ruby-build (который является частью проекта rbenv). То же самое относится и к chruby, который использует другой инструмент для сборки ruby. ПРАВКА (июнь 2021): Похоже, что установки rbenv теперь поставляются с ruby-build и способны компилировать ruby прямо на вашем компьютере. Я оставлю ответ таким, какой он есть, чтобы он имел смысл для кого-то на более старой установке (или на случай, если они вернут это решение позже).
  2. ruby-build должен быть установлен как плагин к rbenv.
  3. На случай, если вам нужно подробнее ознакомиться с инструментами, вот ссылки на rbenv и ruby-build.
  4. Процедура установки обоих инструментов (и множество других справочных материалов) доступна в файлах README для проектов. Обратитесь к ним, если у вас что-то не работает.

Установка rbenv

Выполните следующую команду, чтобы клонировать репозиторий rbenv в .rbenv каталог вашего домашнего каталога.

 $ git clone https://github.com/rbenv/rbenv.git ~/.rbenv
  

Ваша система по-прежнему не знает, где находится rbenv. Добавьте ее в свой path, выполнив:

 $ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
  

Чтобы инициализировать rbenv, чтобы он мог помочь вам с изменением rubies при смене каталогов, запустите это:

 ~/.rbenv/bin/rbenv init
  

Это должно подсказать вам что-то вроде этого:

 # Load rbenv automatically by appending
# the following to ~/.bash_profile:

eval "$(rbenv init -)"
  

Итак, запустите это:

 echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
  

К этому моменту rbenv должен быть установлен. При запуске rbenv в командной строке должно получиться что-то вроде этого:

 $ rbenv
rbenv 1.1.1-39-g59785f6
Usage: rbenv <command> [<args>]

Some useful rbenv commands are:
   commands    List all available rbenv commands
   local       Set or show the local application-specific Ruby version
   global      Set or show the global Ruby version
   shell       Set or show the shell-specific Ruby version
   rehash      Rehash rbenv shims (run this after installing executables)
   version     Show the current Ruby version and its origin
   versions    List all Ruby versions available to rbenv
   which       Display the full path to an executable
   whence      List all Ruby versions that contain the given executable

See `rbenv help <command>' for information on a specific command.
For full documentation, see: https://github.com/rbenv/rbenv#readme

  

ПРИМЕЧАНИЕ: Если вы получите предупреждение о том, что rbenv не установлен, просто запустите source ~/.bash_profile . Это приведет к повторному запуску ~/.bash_profile скрипта и получению rbenv на вашем пути. После этого вы должны быть в состоянии запускаться rbenv без проблем.

Обратите внимание, что rbenv пока не предоставляет возможности установки или удаления rubies. Для этого нам нужно установить ruby-build.

Установка ruby-build

Нам нужно добавить пакет ruby-build в качестве плагина rbenv, чтобы мы могли ввести rbenv install <ruby version> для установки rubies. Все, что вам нужно сделать, это создать каталог плагинов и проверить репозиторий git для ruby-build в каталоге плагинов. Запустите следующее:

 $ mkdir -p "$(rbenv root)"/plugins
$ git clone https://github.com/rbenv/ruby-build.git "$(rbenv root)"/plugins/ruby-build
  

Проверка, установлены ли rbenv и ruby-build

Запуск rbenv без каких-либо аргументов в терминале теперь должен показать, что команды установки и удаления доступны. Что-то вроде этого:

 $ rbenv
rbenv 1.1.1-39-g59785f6
Usage: rbenv <command> [<args>]

Some useful rbenv commands are:
   commands    List all available rbenv commands
   local       Set or show the local application-specific Ruby version
   global      Set or show the global Ruby version
   shell       Set or show the shell-specific Ruby version
   install     Install a Ruby version using ruby-build
   uninstall   Uninstall a specific Ruby version
   rehash      Rehash rbenv shims (run this after installing executables)
   version     Show the current Ruby version and its origin
   versions    List all Ruby versions available to rbenv
   which       Display the full path to an executable
   whence      List all Ruby versions that contain the given executable

See `rbenv help <command>' for information on a specific command.
For full documentation, see: https://github.com/rbenv/rbenv#readme
  

Если вы видите этот вывод, ваш rbenv установлен правильно.

Установка ruby

Чтобы установить ruby 2.5.3, вы могли бы запустить (подождите, пока не запускайте его):

 rbenv install 2.5.3
  

Он должен вывести несколько строк, занять некоторое время, а затем сообщить вам, что установлена версия 2.5.3. Однако существует проблема — при сбое установки, особенно во время компиляции, иногда терминал зависает, и на терминале нет выходных данных. Просто кажется, что она устанавливается надолго (навсегда). Чтобы получить больше информации о том, что происходит, выполните следующее:

 rbenv install -f -v 2.5.3
  

-f Аргумент указывает rbenv принудительно установить данную версию. Итак, если он уже установлен, rbenv переустановит (в основном перезапишет) данную версию. Поэтому, если установка завершилась неудачей, -f убедитесь, что установка завершена.

-v Аргумент указывает rbenv выводить подробные сообщения. Таким образом, вам будет показано все, что делает ruby-build (включая процесс компиляции). Не пугайтесь здесь слова «компиляция«. Обычно она отлично компилируется без проблем и не изменяет вашу систему ruby (ту, которая установлена с sudo apt install ruby в Linux, или ту, которую вы получаете по умолчанию в macOS) независимо от того, успешно она работает или нет.

Тестовая установка

После успешной установки вы можете запустить приведенную ниже команду, чтобы проверить, какие версии установлены (выходные данные приведены во фрагменте ниже):

 $ rbenv versions
  system
* 2.5.3 (set by /home/ubuntu/.rbenv/version)
  

Примечание: на Mac у вновь установленного ruby будет другой путь.

Тот, перед которым стоит * , активен прямо сейчас. Если вы запустите which ruby , вы должны получить путь с прокладкой ruby. Если вам интересно, прочитайте документацию rbenv, чтобы узнать, что такое оболочки, хотя вам не придется беспокоиться о них.

 $ which ruby 
/home/ubuntu/.rbenv/shims/ruby
  

Настроить и забыть

rbenv — классная штука, но продолжать писать rbenv shell 2.5.3 и rbenv shell 2.4.5 каждый раз становится проблемой. Вместо этого вам следует установить версию ruby для каталога и забыть о rbenv.

Вы можете просто создать файл с именем .ruby-version , содержащий одну строку — номер версии ruby, который вы хотите использовать для всех скриптов ruby в этом каталоге (и подкаталогах). Просто перейдите в нужный каталог и запустите:

 echo "2.5.3" > .ruby-version
  

После этого все скрипты ruby в этом каталоге и подкаталогах будут использовать версию 2.5.3.

Комментарии:

1. Спасибо за ваш подробный ответ, не могли бы вы добавить абзац о разнице между rbenv и rvm?

2. @OrtomalaLokni есть много статей, объясняющих детали, и есть детали более низкого уровня, которые я не могу просто объяснить в одном абзаце. Это не имело бы смысла. Возможно, я напишу сообщение и свяжу его здесь. Но я еще не описал различия подробно. Сделаю это со временем. 🙂

3. может быть, тогда вы сможете объяснить разницу между rbenv и rvm в одном предложении?

4. Есть 3 основных отличия: 1) RVM может предоставлять вам готовые двоичные файлы, в то время как и chruby, и rbenv компилируют Ruby в вашей системе. 2) RVM переопределяет оболочку и в основном заменяет команду ‘cd’, которая сама по себе может вызвать проблемы. Rbenv использует прокладки путей (ссылка уже есть в ответе). 3) Файлы версий RVM ( .rvmrc ) представляют собой полноценные скрипты и выполняются , в то время как файлы версий rbenv ( .ruby-version ) представляют собой простые текстовые файлы, содержащие версию ruby, которая будет использоваться в каталоге.

5. Дополнение к пункту (3) из предыдущего ответа: версия Ruby может быть переключена для текущей оболочки, текущего каталога и глобальной системы. Вот отличная статья: makandracards.com/makandra /…

Ответ №2:

Я хотел бы поблагодарить Вайбхава за его информативный ответ. Я еще не пытался установить rbenv, но обязательно попробую это. На данный момент я смог обойти эту проблему, не указывая версию ruby в моем файле gem. Это краткосрочное решение, но оно сработало!

Комментарии:

1. вы могли бы добавить комментарий в качестве комментария под ответом. в любом случае, если ответ помогает / работает для вас, вы могли бы дать ему положительные отзывы или сделать его правильным ответом, вместо того, чтобы говорить спасибо

2. Я поддержал это, к сожалению, у меня недостаточно «кармы», чтобы оно могло зарегистрироваться публично.

3. Спасибо @Andrew 🙂 На всякий случай, если вы когда-нибудь захотите развернуть Rails, я написал подробное руководство по развертыванию Rails . Ответ, который я опубликовал, на самом деле является частью этого руководства. Вы можете обратиться к этому, когда это необходимо. Я надеюсь, что это поможет.