Ответ 1
RVM работает поближе к тому, как работает virtualenv, поскольку он позволяет вам использовать отдельные версии ruby и их драгоценные камни и т.д.
Есть ли что-то похожее на утилиту Python virtualenv?
В основном это позволяет вам устанавливать пакеты Python в изолированную среду, поэтому easy_install django
не входит в каталог общесистемных пакетов в системе, он будет работать в каталоге, созданном 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?
RVM работает поближе к тому, как работает virtualenv, поскольку он позволяет вам использовать отдельные версии ruby и их драгоценные камни и т.д.
Ни песочница, ни RVM, ни rbenv не управляют версиями зависимостей от приложений. Инструмент для этого - связка.
bundle install
для установки явных версий этих зависимостей в изолированное местоbundle exec
для запуска вашего приложенияНикто, кажется, не упомянул rbenv.
Думаю, вам понравится sandbox.
Если вам нужно только установить gems как не root, попробуйте установить переменную среды GEM_HOME
. Затем просто запустите gem
.
Например:
$ export GEM_HOME=$HOME/local/gems
$ gem install rhc
Я расскажу о том, как я это делаю с Bundler (который я использую с RVM - RVM для управления рубинами и набором глобальных драгоценных камней по умолчанию, Bundler для обработки конкретных проектов)
bundler install --binstubs --path vendor
Запуск этой команды в корне проекта будет устанавливать драгоценные камни, перечисленные в вашем Gemfile, поместить библиотеки в ./vendor
и любые исполняемые файлы в ./bin
и все require
(если вы используете bundle console
или Bundler требует) будет ссылаться на эти exes и libs.
Работает для меня.
Я рекомендую direnv. Это оболочка среды для оболочки.
Перед каждым приглашением проверяется наличие файла ".envrc" в текущем и родительском каталогах. Если файл существует (и авторизован), он загружается в под-оболочку bash, и все экспортированные переменные затем захватываются direnv, а затем становятся доступными для текущей оболочки.
Вот как использовать direnv с 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, добавив команду use rbenv
в любой файл .envrc
. Это активирует rbenv, который, в свою очередь, поместит рубиновые обертки в PATH.
Обратите внимание, что для этого не нужно устанавливать rbenv в .bashrc или .zshrc, чтобы это работало.
Вот самый сложный .envrc, который я использую для ruby-проектов:
rvm use 1.8.7
layout ruby
PATH_add .direnv/bundler-bin
rvm используется для выбора правильной рубиновой версии для вас
Команды макета автоматически устанавливают некоторые обычные переменные среды. Пока существует только рубиновый макет. То, что он делает, задает переменную среды GEM_HOME и каталог bin для вашего пути. Потому что это зависит от версии ruby, обязательно вызовите ее после "rvm". Поскольку в каждом каталоге рубинового макета есть свой GEM_HOME, вам не нужно использовать rvm gemsets.
PATH_add добавляет и расширяет данный относительный путь. В этом случае я использую это, чтобы отделить binstubs от буфера от моих собственных скриптов bin с помощью bundle install --binstubs .direnv/bundler-bin
Если вы хотите узнать, что именно делают эти команды, пока: cat direnv stdlib
| меньше
Mineshaft - это проект, над которым я работал некоторое время и продолжаю работу по разработке.
Он предлагает возможность создавать виртуальные среды, сходные с тем, как работает virtualenv, а также может также устанавливать Ruby на глобальном уровне.