Рубиновый эквивалент virtualenv?

165

Есть ли что-то похожее на утилиту Python virtualenv ?

По сути, он позволяет вам устанавливать пакеты Python в изолированную среду, поэтому easy_install djangoон не попадает в общесистемный каталог site-packages, а попадает в каталог, созданный virtualenv.

Например:

$ virtualenv test
New python executable in test/bin/python
Installing setuptools...cd .........done.
$ cd test/
$ source bin/activate
(test)$ easy_install tvnamer
Searching for tvnamer
Best match: tvnamer 0.5.1
Processing tvnamer-0.5.1-py2.5.egg
Adding tvnamer 0.5.1 to easy-install.pth file
Installing tvnamer script to /Users/dbr/test/bin

Using /Library/Python/2.5/site-packages/tvnamer-0.5.1-py2.5.egg
Processing dependencies for tvnamer
Finished processing dependencies for tvnamer
(test)$ which tvnamer 
/Users/dbr/test/bin/tvnamer

Есть ли что-то подобное для RubyGems?

DBR
источник

Ответы:

85

RVM работает ближе к тому, как работает virtualenv, так как он позволяет вам помещать в песочницу разные версии ruby, их жемчужины и т. Д.

Ван нгуен
источник
5
Пробовал и песочницу и RVM и думаю, что RVM - намного лучшее решение.
Иванжованович
9
ivanjovanovic. почему вы нашли RVM лучше, чем песочница?
pwan
68

Ни песочница, RVM, ни rbenv не управляют версиями гем-зависимостей вашего приложения. Инструмент для этого - упаковщик .

  • используйте Gemfile в качестве объявления зависимости вашего приложения
  • использовать bundle installдля установки явных версий этих зависимостей в изолированном месте
  • использовать bundle execдля запуска вашего приложения
PJE
источник
6
Кроме того, лично я думаю, что люди злоупотребляют rbenv / rvm. Если вам абсолютно не нужно иметь несколько изолированных версий ruby ​​на одной машине - и вы, вероятно, этого не делаете - не используйте rbenv / rvm. Их "абстракция" не приходит бесплатно; Я гарантирую, вам придется потратить время на их отладку в какой-то момент. Мой совет: просто установите ruby ​​с помощью менеджера пакетов вашей операционной системы. Последний самый большой.
августа
6
Я что-то упускаю? Bundler по-прежнему пытается установить пакеты для всей системы по умолчанию.
detly
6
Изолированные среды практически не являются обязательными в современном рабочем процессе. Если вы полагаетесь на системный ruby ​​и диспетчер системных пакетов, у вас НЕТ гарантий, что ваши установки будут повторяемыми, и это будет вам неприятно, когда наступит время развертывания. Из курса вы будете иногда увязнуть борьбу Инсталляционный монстра. Это тоже хорошая вещь. Потому что вы решаете проблемы в своей среде разработки, поэтому вам никогда не придется решать их в своей среде. Повторим, если вам платят за код, никогда не используйте системную среду. Используйте изолированную среду для здравомыслия.
Шейн
19

Кажется, никто не упомянул rbenv .

Сюань
источник
rbenv - менеджер ruby, но он на уровне пакетов (эквивалент virtualenv) изначально не предлагает менеджера gemset, чтобы иметь возможность предлагать виртуальную среду.
екта
16

Я думаю, вам понравится песочница .

dylanfm
источник
9
Святое дерьмо, что переписывает $HOME?! Что, черт возьми, драгоценные камни , нужно , что для? Печально то, что это лучшее, что я видел на работе. Даже бандлер по умолчанию устанавливает в системный путь ruby.
Крис Р
6
песочница не обновлялась в течение ~ 4 лет (последний коммит был в декабре 2008 года), RVM все еще находится в активной разработке (последний коммит был вчера)
dbr
16

Я упомяну способ, которым я делаю это с Bundler (который я использую с RVM - RVM для управления рубинами и набором глобальных драгоценных камней по умолчанию, Bundler для обработки драгоценных камней, специфичных для проекта)

bundler install --binstubs --path vendor

Выполнение этой команды в корне проекта установит гемы, перечисленные в вашем Gemfile, поместит библиотеки ./vendorи все исполняемые файлы ./binи все requires (если вы используетеbundle console или требует Bundler) будет ссылаться на эти exes и библиотеки.

Работает для меня.

Iain
источник
Небольшой совет для тех, кто работает в macOS: если вы vendor.noindexназовете путь, по которому ваши поиски Spotlight не будут загромождены данными, проиндексированными из продаваемых драгоценных камней.
Иэн
1
Это то, что я делаю тоже (с rbenv, но это другая история), так как он изолирует gemset и версию ruby. Ничто не установлено в масштабе всей системы, и у каждого проекта есть все свои зависимости, хорошо объявленные. Совет: используйте, bundle config path vendorчтобы никогда не забывать этот аргумент.
Нандилугио
15

Если вам нужно установить gems только без полномочий root, попробуйте установить GEM_HOMEпеременную окружения. Тогда просто беги gem.

Например:

$ export GEM_HOME=$HOME/local/gems
$ gem install rhc
MPB
источник
Потрясающие! На OSX эта папка скрыта:export GEM_HOME=$HOME/.local/gems
Bruno
1
Это может быть проще в использовании, GEM_HOME=$HOME/.localпоэтому он использует одну и ту же .binпапку. В этом случае нам не нужно обновлять нашу $PATHпеременную.
Бруно
Примечание: stackoverflow.com/questions/55074420/…
Ян Кью Пеблик
Безусловно, самый чистый подход без зависимостей, который я когда-либо видел, для установки инструментов, которые не нарушают друг друга при обновлении (все, что осталось, это добавить псевдоним в свой, ~/.bashrcи все готово). +1
Парадоксис
4

Я рекомендую direnv . Это переключатель среды для оболочки.

Перед каждым запросом проверяется наличие файла «.envrc» в текущем и родительском каталогах. Если файл существует (и авторизован), он загружается в под-оболочку bash, и все экспортируемые переменные затем записываются в direnv и затем делают доступной текущую оболочку.

Вот как использовать direnv с ruby-install

+ ruby-install

Добавьте это к ~/.direnvrc

use_ruby() {
  local ruby_root=$HOME/.rubies/$1
  load_prefix "$ruby_root"
  layout_ruby
}

Установите ruby-install ( brew install ruby-install) и установите несколько рубинов.

ruby-install ruby 1.9.3
ruby-install ruby 2.0.0
ruby-install ruby 2.2.0

А затем сделайте пару символических ссылок для удобства:

ln -s .rubies/1.9 ruby-1.9.3-p*
ln -s .rubies/2.0 ruby-2.0.0
ln -s .rubies/2.2 ruby-2.2.0

И, наконец, в любом проекте .envrc:

use ruby 2.0

Это поместит все драгоценные камни в .direnv/rubyкаталог проекта (облегчает открытие драгоценных камней). bundler поместит двоичные файлы оболочки .direnv/bin(не более bundle exec!).

+ rbenv

Также можно использовать rbenv, добавив use rbenvкоманду в любой.envrc файл. Это активирует rbenv, который, в свою очередь, поместит оболочки ruby ​​в PATH.

Обратите внимание, что не обязательно устанавливать rbenv в .bashrc или .zshrc, чтобы это работало.

+ RVM

Вот самый сложный .envrc, который я использую в проектах ruby:

rvm use 1.8.7
layout ruby
PATH_add .direnv/bundler-bin

rvm используется для выбора правильной версии ruby ​​для вас

Команды компоновки автоматически устанавливают некоторые обычные переменные среды. На данный момент существует только рубиновый макет. Он устанавливает переменную среды GEM_HOME и ее каталог bin по вашему пути. Поскольку это зависит от версии ruby, обязательно вызывайте ее после «rvm». Поскольку у каждой директории макета ruby ​​есть свой собственный GEM_HOME, вам не нужно использовать наборы гемов rvm.

PATH_add добавляет и расширяет заданный относительный путь. В этом случае я использую это для отделения binstubs-пакетов от моих собственных bin-скриптов сbundle install --binstubs .direnv/bundler-bin

Если вы хотите узнать, что именно делают эти команды, сейчас: cat direnv stdlib| Меньше

Шин Ким
источник
2
Хотя эта ссылка может ответить на вопрос, лучше включить сюда основные части ответа и предоставить ссылку для справки. Ответы, содержащие только ссылки, могут стать недействительными, если связанная страница изменится. - Из Обзора
Jezrael
@ Jezrael Спасибо за ваш комментарий!
Шин Ким
1
Супер, без проблем.
Jezrael
1

Mineshaft - это проект, над которым я работал в течение некоторого времени и продолжаю работу по разработке.

Он предлагает возможность как создавать виртуальные среды, схожие с тем, как работает virtualenv, так и глобальную установку Ruby.

ctesterman
источник