Setara dengan Ruby virtualenv?

165

Apakah ada sesuatu yang mirip dengan utilitas Python virtualenv ?

Pada dasarnya ini memungkinkan Anda untuk menginstal paket Python ke lingkungan berpasir, jadi easy_install django jangan masuk ke direktori paket situs sistem Anda, itu akan masuk ke direktori virtualenv yang dibuat.

Sebagai contoh:

$ 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

Apakah ada yang seperti ini untuk RubyGems?

dbr
sumber

Jawaban:

84

RVM bekerja lebih dekat dengan bagaimana virtualenv bekerja karena memungkinkan Anda mem-sandbox versi ruby ​​yang berbeda dan permata mereka, dll

Van Nguyen
sumber
5
Mencoba kedua sandbox dan RVM dan berpikir bahwa RVM adalah solusi yang jauh lebih baik.
ivanjovanovic
9
ivanjovanovic. mengapa Anda menemukan RVM lebih baik daripada kotak pasir?
pwan
67

Baik kotak pasir, RVM, atau rbenv mengelola versi dependensi permata aplikasi Anda. Alat untuk itu adalah bundler .

  • gunakan Gemfile sebagai deklarasi ketergantungan aplikasi Anda
  • menggunakan bundle install untuk menginstal versi eksplisit dari dependensi ini ke lokasi yang terisolasi
  • gunakan bundle execuntuk menjalankan aplikasi Anda
Pje
sumber
6
Juga, secara pribadi saya pikir orang terlalu sering menggunakan rbenv / rvm. Jika Anda tidak benar-benar perlu memiliki beberapa versi ruby ​​yang terisolasi pada mesin yang sama — dan Anda mungkin tidak — jangan menggunakan rbenv / rvm. "Abstraksi" mereka tidak datang secara gratis; Saya jamin Anda harus menghabiskan waktu men-debug mereka di beberapa titik. Saran saya: cukup pasang ruby ​​dengan manajer paket sistem operasi Anda. Terbaru adalah yang terbaik.
PT.
6
Apakah saya melewatkan sesuatu? Bundler masih mencoba menginstal sistem paket secara luas.
detly
6
Lingkungan yang terisolasi cukup non-opsional dalam alur kerja modern. Jika Anda mengandalkan sistem ruby ​​dan manajer paket sistem, Anda TIDAK memiliki jaminan instalasi Anda akan berulang dan itu akan menggigit Anda saat menghadapi waktu penyebaran. Tentu saja Anda kadang-kadang akan terjebak melawan monster instalasi. Itu juga hal yang baik. Karena Anda memecahkan masalah di lingkungan dev Anda sehingga Anda tidak perlu menyelesaikannya di lingkungan hidup Anda. Untuk ulangi, jika Anda dibayar untuk kode tidak pernah menggunakan lingkungan sistem. Gunakan lingkungan yang terisolasi, demi kewarasan.
Shayne
19

Sepertinya tidak ada yang menyebutkan rbenv .

Xuan
sumber
rbenv adalah manajer ruby, tetapi pada tingkat paket (setara dengan virtualenv), ia tidak secara bawaan menawarkan manajer permata untuk dapat menawarkan env virtual.
yekta
16

Saya pikir Anda akan menyukai kotak pasir .

dylanfm
sumber
9
Omong kosong, itu penulisan ulang $HOME?! Untuk apa permata membutuhkan itu ? Yang menyedihkan adalah, itu hal terbaik yang pernah saya lihat untuk pekerjaan itu. Bahkan bundler default untuk menginstal di jalur ruby ​​sistem.
Chris R
6
sandbox belum diperbarui dalam ~ 4 tahun (komit terakhir pada Desember 2008), RVM masih dalam pengembangan aktif (komit terakhir adalah kemarin)
dbr
16

Saya akan menyebutkan cara saya melakukan ini dengan Bundler (yang saya gunakan dengan RVM - RVM untuk mengelola batu rubi dan satu set default permata global, Bundler untuk menangani permata khusus proyek)

bundler install --binstubs --path vendor

Menjalankan perintah ini di root proyek akan menginstal permata yang terdaftar dari Gemfile Anda, memasukkan libs ./vendor, dan semua executable di dalam ./bindan semua requires (jika Anda menggunakanbundle console atau Bundler mengharuskan) akan merujuk exes dan libs ini.

Bekerja untukku.

iain
sumber
Tip untuk mereka yang menggunakan MacOS, jika Anda memberi nama jalur vendor.noindexpencarian Spotlight Anda tidak akan berantakan dengan data yang diindeks dari permata yang dibatalkan.
iain
1
Ini adalah apa yang saya lakukan juga (dengan rbenv, tapi itu cerita lain), karena ini mengisolasi permata dan versi ruby. Tidak ada yang terpasang di seluruh sistem dan setiap proyek memiliki semua dependensi yang dideklarasikan dengan baik. Kiat: gunakan bundle config path vendoruntuk tidak pernah melupakan argumen itu.
nandilugio
15

Jika Anda hanya perlu menginstal permata sebagai non-root, coba atur GEM_HOMEvariabel lingkungan. Maka jalankan sajagem .

Sebagai contoh:

$ export GEM_HOME=$HOME/local/gems
$ gem install rhc
mpb
sumber
Luar biasa! Pada OSX folder itu disembunyikan:export GEM_HOME=$HOME/.local/gems
Bruno
1
Mungkin lebih mudah digunakan GEM_HOME=$HOME/.localsehingga berbagi .binfolder yang sama . Dalam hal ini kita tidak perlu memperbarui $PATHvariabel kita .
Bruno
Sejauh ini, pendekatan tanpa-ketergantungan terbersih yang pernah saya lihat untuk menginstal alat yang tidak saling menghancurkan ketika diperbarui (yang tersisa adalah menambahkan alias di Anda ~/.bashrcdan Anda selesai). +1
Paradoxis
4

Saya merekomendasikan direnv . Ini adalah pengalih lingkungan untuk shell.

Sebelum setiap prompt ia memeriksa keberadaan file ".envrc" di direktori saat ini dan induk. Jika file ada (dan diotorisasi), file tersebut dimuat ke dalam sub-shell bash dan semua variabel yang diekspor kemudian ditangkap oleh direnv dan kemudian menyediakan shell saat ini.

Inilah cara menggunakan direnv dengan ruby-install

+ ruby-install

Tambahkan ini ke ~/.direnvrc

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

Instal ruby-install ( brew install ruby-install) dan instal sekelompok rubi.

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

Dan kemudian buat beberapa symlink untuk kenyamanan:

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

Dan akhirnya dalam proyek apa pun .envrc:

use ruby 2.0

Ini akan menempatkan semua permata di bawah .direnv/rubydirektori proyek (membuat pembukaan permata lebih mudah). bundler akan memasukkan binari pembungkus .direnv/bin(tidak lebih bundle exec!).

+ rbenv

Anda juga dapat menggunakan rbenv dengan menambahkan use rbenvperintah apa pun.envrc file . Ini akan mengaktifkan rbenv yang pada gilirannya akan menempatkan pembungkus ruby ​​di PATH.

Perhatikan bahwa tidak perlu menginstal rbenv di .bashrc atau .zshrc agar ini berfungsi.

+ RVM

Berikut ini .envrc paling rumit yang saya gunakan pada proyek ruby:

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

rvm digunakan untuk memilih versi ruby ​​yang tepat untuk Anda

perintah tata letak secara otomatis mengatur beberapa variabel lingkungan yang biasa. Untuk saat ini hanya ada tata letak ruby. Apa yang dilakukannya adalah mengatur variabel lingkungan GEM_HOME dan direktori bin-nya ke path Anda. Karena itu tergantung pada versi ruby, pastikan untuk memanggilnya setelah "rvm". Karena setiap direktori tata letak ruby ​​memiliki GEM_HOME sendiri, Anda tidak perlu menggunakan permata rvm.

PATH_add menambahkan dan memperluas jalur relatif yang diberikan. Dalam hal ini, saya menggunakan ini untuk memisahkan binstubs bundler dari skrip bin saya sendiribundle install --binstubs .direnv/bundler-bin

Jika Anda ingin mengetahui apa yang sebenarnya dilakukan perintah-perintah itu, untuk saat ini: cat direnv stdlib| kurang

Shin Kim
sumber
2
Meskipun tautan ini dapat menjawab pertanyaan, lebih baik untuk memasukkan bagian-bagian penting dari jawaban di sini dan memberikan tautan untuk referensi. Jawaban hanya tautan dapat menjadi tidak valid jika halaman tertaut berubah. - Dari Ulasan
jezrael
@ jezrael Terima kasih atas komentar Anda!
Shin Kim
1
Super, tidak masalah.
jezrael
1

Mineshaft adalah proyek yang telah saya kerjakan selama beberapa waktu dan saya sedang melanjutkan pengembangan.

Ia menawarkan kemampuan untuk menciptakan lingkungan virtual yang serupa dengan cara kerja virtualenv dan juga dapat menginstal Ruby secara global.

ctesterman
sumber