Ruby еквівалент virtualenv?


165

Чи є щось схоже на утиліту 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?

Відповіді:


85

RVM працює ближче до того, як працює virtualenv, оскільки він дозволяє пісочниці різних рубінових версій та їхніх дорогоцінних каменів тощо.


5
Спробував і пісочницю, і RVM і подумав, що RVM - це набагато краще рішення.
ivanjovanovic

9
іванжованович. чому ви знайшли RVM краще, ніж пісочницю?
pwan

68

Ні пісочниця, ні RVM, ні rbenv не керують версіями залежностей від дорогоцінних каменів вашого додатка. Інструментом для цього є постачальник .

  • використовувати Gemfile як декларацію залежності програми
  • використовувати bundle installдля встановлення явних версій цих залежностей в ізольоване місце
  • використовувати bundle execдля запуску програми

6
Крім того, особисто я думаю, що люди зловживають rbenv / rvm. Якщо вам зовсім не потрібно мати кілька, ізольованих версій рубіну на одній машині, а ви, ймовірно, не використовуйте rbenv / rvm. Їх "абстракція" не приходить безкоштовно; Я гарантую, що вам доведеться витратити час налагодження їх у якийсь момент. Моя порада: просто встановіть рубін разом із менеджером пакетів вашої операційної системи. Останній - найбільший.
пн

6
Я щось пропускаю? Bundler все ще намагається встановити систему пакетів за замовчуванням.
detly

6
Ізольоване середовище, як правило, необов’язково в сучасному робочому процесі. Якщо ви покладаєтесь на системний рубін і менеджер системних пакетів, у вас немає жодних гарантій, що ваші встановлення будуть повторюваними, і це буде кусати вас в обличчя. З курсу ви будете іноді загрузнути боротьбу Інсталяційний монстра. Це теж гарна річ. Тому що ви вирішуєте проблеми у своєму розробницькому середовищі, тому вам ніколи не доведеться вирішувати їх у своєму житті. Повторюся, якщо вам платять за код, ніколи не використовуйте системне середовище. Використовуйте ізольоване середовище, заради здорового здоров'я.
Шейн

19

Здається, ніхто не згадував rbenv .


rbenv - рубіновий менеджер, але на рівні пакету (еквівалент virtualenv) він не пропонує власному менеджеру gemset, щоб мати можливість запропонувати віртуальну програму.
yekta

16

Я думаю, вам сподобається пісочниця .


9
Святе лайно, що переписує $HOME?! Що, чорт візьми, дорогоцінні камені , потрібно , що для? Сумно в тому, що це найкраще, що я бачив на роботі. Навіть постачальник за замовчуванням встановлюється в системному рубіновому шляху.
Кріс Р

6
пісочниця не оновлювалася протягом ~ 4 років (остання фіксація була в грудні 2008 р.), RVM все ще знаходиться в активному розвитку (остання фіксація була вчора)
грудень

16

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

bundler install --binstubs --path vendor

Запустивши цю команду в корені проекту, ви встановите дорогоцінні камені, перелічені у вашому Gemfile, покладете на них libs ./vendorта будь-які виконувані файли ./binта всі requires (якщо ви використовуєте bundle consoleабо вимагає Bundler), посилаються на ці exes та libs.

Працює для мене.


Підказка для тих, хто працює на macOS, якщо ви vendor.noindexназвете шлях, який шукає Spotlight, не буде захаращено даними, індексованими з доданих дорогоцінних каменів.
Iain

1
Це я теж роблю (з цим rbenv, але це вже інша історія), оскільки це ізолює гемсет та версію рубіну. Нічого не встановлено в усьому світі, і кожен проект має всі свої залежності, які добре задекларовані. Порада: використовуйте, bundle config path vendorщоб ніколи не забувати цей аргумент.
nandilugio

15

Якщо вам потрібно встановити лише дорогоцінні камені як не-root, спробуйте встановити GEM_HOMEзмінну середовища. Тоді просто біжи gem.

Наприклад:

$ export GEM_HOME=$HOME/local/gems
$ gem install rhc

Дивовижно! На OSX ця папка прихована:export GEM_HOME=$HOME/.local/gems
Бруно

1
Використовувати GEM_HOME=$HOME/.localце може бути простіше, тому він має спільну .binпапку. У такому випадку нам не доведеться оновлювати нашу $PATHзмінну.
Бруно


На сьогоднішній день найчистіший підхід без залежностей, який я бачив, для встановлення інструментів, які не ламають один одного під час оновлення (все, що залишилося, - це додавання псевдоніма у вашому, ~/.bashrcі ви закінчили). +1
Парадокс

4

Рекомендую діренв . Це перемикач середовища для оболонки.

Перед кожним запитом він перевіряє наявність файлу ".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

Також можна використовувати rbenv, додавши use rbenvкоманду в будь-який .envrcфайл. Це активує rbenv, який, в свою чергу, помістить рубінові обгортки в PATH.

Зауважте, що для цього не потрібно встановлювати rbenv в .bashrc або .zshrc.

+ RVM

Ось найскладніший .envrc, який я використовую в рубінових проектах:

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

rvm використовується для вибору потрібної для вас версії ruby

Команди компонування автоматично встановлюють деякі звичні змінні середовища. Наразі існує лише макет рубіну. Для цього потрібно встановити змінну середовища GEM_HOME, і це каталог бін на ваш шлях. Оскільки це залежить від версії ruby, обов'язково зателефонуйте після "rvm". Оскільки у всіх каталогах макетів рубіну є свої GEM_HOME, вам не потрібно використовувати гемсети rvm.

PATH_add передує і розширює заданий відносний шлях. У такому випадку я використовую це для того, щоб відокремити скриньки постачальників пакетів від власних скриптів бінаbundle install --binstubs .direnv/bundler-bin

Якщо ви хочете дізнатися, що саме роблять ці команди, наразі: cat direnv stdlib| менше


2
Хоча це посилання може відповісти на питання, краще включити сюди суттєві частини відповіді та надати посилання для довідки. Відповіді лише на посилання можуть стати недійсними, якщо пов'язана сторінка зміниться. - З огляду
jezrael

@ jezrael Дякую за ваш коментар!
Шин Кім

1
Супер, жодних проблем.
jezrael

1

Шахта Шахта - це проект, над яким я працюю певний час і продовжую роботу над розробкою.

Він пропонує можливість як створювати віртуальні середовища, подібні до того, як працює virtualenv, так і може встановлювати Ruby також у всьому світі.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.