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にこのようなものはありますか?

回答:


84

RVMは、異なるRubyバージョンやそれらのGemなどをサンドボックス化できるため、virtualenvの動作により近い動作をします。


5
サンドボックスとRVMの両方を試して、RVMの方がはるかに優れたソリューションであると考えました。
ivanjovanovic 2010年

9
イヴァンジョバノビッチ。サンドボックスよりもRVMが優れている理由は何ですか?
pwan

67

サンドボックス、RVM、rbenvのいずれも、アプリのgem依存関係のバージョンを管理しません。そのためのツールはbundlerです。

  • アプリケーションの依存関係宣言としてGemfileを使用する
  • bundle installこれらの依存関係の明示的なバージョンを隔離された場所にインストールするために使用します
  • bundle execアプリケーションを実行するために使用します

6
また、個人的にはrbenv / rvmを使いすぎていると思います。同じマシン上に複数の隔離されたバージョンのrubyを絶対に置く必要がない場合(そしておそらく必要ない場合)は、rbenv / rvmを使用しないでください。彼らの「抽象化」は無料ではありません。いつかはデバッグに時間を費やす必要があることを保証します。私のアドバイス:オペレーティングシステムのパッケージマネージャーでrubyをインストールするだけです。最新が最高です。
2014年

6
何か不足していますか?Bundlerはデフォルトでシステム全体にパッケージをインストールしようとします。
detly

6
分離された環境は、現代のワークフローではほとんどオプションではありません。あなたは、システムのルビーとシステムパッケージマネージャに依存している場合、あなたは持っているNOをお使いのインストールが再現可能になります保証と顔であなたを噛まないように起こってthatsのは、デプロイ時に来ます。うちもちろん、あなたは時折インストールモンスターと戦って行き詰まるでしょう。それも良いことです。開発環境で問題を解決するため、実際の環境で問題を解決する必要はありません。繰り返しになりますが、コードに支払われた場合、システム環境を使用しないでください。健全性のために、隔離された環境を使用してください。
Shayne、

19

誰もrbenvについて言及していないようです


rbenvはrubyマネージャーですが、パッケージレベル(virtualenvと同等)では、virtual envを提供できるgemsetマネージャーをネイティブに提供していません。
yekta

16

あなたはサンドボックスが好きになると思います。


9
神聖ながらくた、それは書き直し$HOMEますか?宝石は何地獄を必要としないことをするために?悲しいことに、それは私がこの仕事で見た中で最高のものです。バンドラーでさえ、デフォルトでシステムのルビパスにインストールされます。
クリスR

6
サンドボックスは4年以内に更新されていません(最後のコミットは2008年12月でした)、RVMはまだ開発中です(最後のコミットは昨日です)
dbr

16

Bundlerでこれを行う方法について説明します(RVM-RVMを使用して、ルビーとデフォルトのグローバルgemのセットを管理し、Bundlerがプロジェクト固有のgemを処理します)

bundler install --binstubs --path vendor

プロジェクトのルートでこのコマンドを実行すると、Gemfileからリストされたgemがインストールされ、libがに配置されます。./vendor実行可能ファイル./binとすべてrequireのs(使用するbundle consoleか、Bundlerが必要な場合)は、これらのexeとlibを参照します。

私のために働く。


macOSをvendor.noindexお使いの方におすすめのヒントです。パスに名前を付けても、Spotlightで検索しても、ベンダーの宝石からインデックスが付けられたデータが乱雑になることはありません。
iain

1
これはrbenv、gemsetとrubyのバージョンを分離するため、私も同じようにしています(ただし、これは別の話です)。システム全体には何もインストールされておらず、すべてのプロジェクトには依存関係がすべて宣言されています。ヒント:bundle config path vendorその引数を決して忘れないようにしてください。
nandilugio

15

非rootとしてgemをインストールするだけでよい場合は、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変数を更新する必要はありません。
Bruno


更新時にお互いを壊さないツールをインストールするための、これまで見た中で最もクリーンな非依存性アプローチ(残っているのは、エイリアスを追加する~/.bashrcだけです)。+1
Paradoxis

4

direnvをお勧めします。シェル用の環境スイッチャーです。

各プロンプトの前に、現在のディレクトリと親ディレクトリに「.envrc」ファイルが存在するかどうかを確認します。ファイルが存在する(かつ承認されている)場合、そのファイルはbashサブシェルにロードされ、エクスポートされたすべての変数がdirenvによってキャプチャされ、現在のシェルで使用できるようになります。

これは、ruby-installで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を使用することもできます。これによりrbenvがアクティブになり、rubyラッパーがPATHに追加されます。

これを機能させるために.bashrcまたは.zshrcにrbenvをインストールする必要はないことに注意してください。

+ RVM

Rubyプロジェクトで使用する最も複雑な.envrcは次のとおりです。

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

rvmは、適切なRubyバージョンを選択するために使用されます

レイアウトコマンドは、通常の環境変数の一部を自動的に設定します。現時点では、ルビレイアウトのみが存在します。GEM_HOME環境変数とそのbinディレクトリをパスに設定します。Rubyのバージョンに依存するため、必ず「rvm」の後に呼び出してください。各ルビレイアウトディレクトリには独自のGEM_HOMEがあるため、rvmのgemsetを使用する必要はありません。

PATH_addは、指定された相対パスの先頭に追加して展開します。その場合、私はこれを使用して、自分のビンスクリプトからバンドラービンスタブを分離します。bundle install --binstubs .direnv/bundler-bin

これらのコマンドが正確に何を行うかを知りたい場合は、今のところ:cat direnv stdlib| もっと少なく


2
このリンクで質問に答えることができますが、回答の重要な部分をここに含め、参照用のリンクを提供することをお勧めします。リンクされたページが変更されると、リンクのみの回答が無効になる可能性があります。- レビューから
jezrael

@ jezraelコメントありがとうございます!
Shin Kim

1
スーパー、問題ありません。
jezrael

1

Mineshaftは、私がしばらくの間取り組んできたプロジェクトであり、開発作業を続けています。

virtualenvの動作に似た仮想環境を作成する機能と、Rubyをグローバルにインストールする機能の両方を提供します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.