Ruby equivalente a virtualenv?

165

Existe algo semelhante ao utilitário virtualenv do Python ?

Basicamente, ele permite que você instale pacotes Python em um ambiente em área restrita, para easy_install djangonão entrar no diretório de pacotes de sites em todo o sistema, mas no diretório virtualenv-created.

Por exemplo:

$ 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

Existe algo parecido com isto para RubyGems?

dbr
fonte

Respostas:

84

O RVM trabalha mais próximo de como o virtualenv funciona, pois permite sandbox diferentes versões de ruby ​​e suas gemas, etc.

Van Nguyen
fonte
5
Tentei o sandbox e o RVM e acho que o RVM é uma solução muito melhor.
Ivanjovanovic
9
ivanjovanovic. por que você achou o RVM melhor que o sandbox?
pwan
67

Nem o sandbox, o RVM nem o rbenv gerenciam as versões das dependências de gemas do seu aplicativo. A ferramenta para isso é o empacotador .

  • use um Gemfile como declaração de dependência do seu aplicativo
  • use bundle installpara instalar versões explícitas dessas dependências em um local isolado
  • use bundle execpara executar seu aplicativo
pje
fonte
6
Pessoalmente, acho que as pessoas usam demais o rbenv / rvm. Se você absolutamente não precisa ter várias versões isoladas de ruby ​​na mesma máquina - e provavelmente não precisa - não use rbenv / rvm. Sua "abstração" não é de graça; Eu garanto que você terá que gastar tempo depurando-os em algum momento. Meu conselho: basta instalar o ruby ​​com o gerenciador de pacotes do seu sistema operacional. O mais recente é o melhor.
Pje 26/10/14
6
Estou esquecendo de algo? O Bundler ainda tenta instalar os pacotes em todo o sistema, por padrão.
detly
6
Ambientes isolados são praticamente não opcionais em um fluxo de trabalho moderno. Se você depende do ruby ​​do sistema e do gerenciador de pacotes do sistema, NÃO tem garantias de que suas instalações serão repetíveis e isso vai te incomodar na hora da implantação. É claro que você ocasionalmente ficará atolado lutando contra o monstro de instalação. Isso também é uma coisa boa. Porque você resolve os problemas no seu ambiente de desenvolvimento para nunca ter que resolvê-los no seu ambiente ao vivo. Para repetir, se você é pago para codificar nunca use o ambiente do sistema. Use um ambiente isolado, por uma questão de sanidade.
Shayne
19

Ninguém parece ter mencionado rbenv .

Xuan
fonte
O rbenv é um gerenciador de ruby, mas no nível do pacote (o equivalente ao virtualenv) não oferece nativamente um gerenciador de gemset para oferecer um ambiente virtual.
Yekta
16

Eu acho que você vai gostar de sandbox .

dylanfm
fonte
9
Caramba, isso reescreve $HOME?! Para que diabos as gemas precisam disso ? O triste é que é a melhor coisa que eu já vi no trabalho. Até o empacotador padroniza a instalação no caminho ruby ​​do sistema.
Chris R
6
sandbox não foi atualizado em ~ 4 anos (a última confirmação foi em dezembro de 2008), o RVM ainda está em desenvolvimento ativo (a última confirmação foi ontem)
dbr
16

Mencionarei a maneira como faço isso com o Bundler (que eu uso com o RVM - RVM para gerenciar os rubis e um conjunto padrão de gemas globais, o Bundler para lidar com gemas específicas do projeto)

bundler install --binstubs --path vendor

A execução deste comando na raiz de um projeto instalará as gemas listadas no seu Gemfile, colocará as bibliotecas ./vendore todos os executáveis ​​em ./bine todos os requires (se você usar bundle consoleou o Bundler exigir) farão referência a esses exes e bibliotecas.

Funciona para mim.

iain
fonte
Uma dica para os que estão no macOS, se você nomear o caminho que vendor.noindexo Spotlight pesquisa não será cheio de dados indexados a partir das gemas vendidas.
iain 17/08/19
1
É o que eu faço também (com rbenv, mas isso é outra história), uma vez que isola o gemset e a versão ruby. Nada é instalado em todo o sistema e todo projeto tem todas as suas dependências bem declaradas. Dica: use bundle config path vendorpara nunca esquecer esse argumento.
Nandilugio 29/10/19
15

Se você precisar instalar apenas gemas como não raiz, tente definir a GEM_HOMEvariável de ambiente. Então apenas corra gem.

Por exemplo:

$ export GEM_HOME=$HOME/local/gems
$ gem install rhc
mpb
fonte
Impressionante! No OSX, essa pasta está oculta:export GEM_HOME=$HOME/.local/gems
Bruno
1
Pode ser mais fácil de usar GEM_HOME=$HOME/.locale compartilhar a mesma .binpasta. Nesse caso, não precisamos atualizar nossa $PATHvariável.
Bruno
De longe, a abordagem mais limpa e sem dependência que já vi para instalar ferramentas que não se quebram quando atualizadas (tudo o que resta é adicionar um alias no seu ~/.bashrce pronto). +1
Paradoxis
4

Eu recomendo direnv . É um alternador de ambiente para o shell.

Antes de cada prompt, ele verifica a existência de um arquivo ".envrc" nos diretórios atual e pai. Se o arquivo existir (e autorizado), ele será carregado em um sub-shell bash e todas as variáveis ​​exportadas serão capturadas pelo direnv e disponibilizadas no shell atual.

Aqui está como usar o direnv com o ruby-install

+ instalação do ruby

Adicione isso ao ~/.direnvrc

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

Instale o ruby-install ( brew install ruby-install) e instale um monte de rubis.

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

E faça alguns links simbólicos por conveniência:

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

E finalmente em qualquer projeto .envrc:

use ruby 2.0

Isso colocará todas as gemas no .direnv/rubydiretório do projeto (facilita a abertura das gemas). o empacotador colocará binários de wrapper .direnv/bin(não mais bundle exec!).

+ rbenv

Também é possível usar o rbenv adicionando o use rbenvcomando em qualquer .envrcarquivo. Isso ativará o rbenv, que por sua vez colocará os invólucros de rubi no PATH.

Observe que não é necessário instalar o rbenv no .bashrc ou no .zshrc para que isso funcione.

+ RVM

Aqui está o .envrc mais complicado que eu uso em projetos ruby:

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

rvm é usado para selecionar a versão correta do ruby ​​para você

Os comandos de layout definem automaticamente algumas das variáveis ​​de ambiente usuais. Por enquanto, apenas o layout ruby ​​existe. O que ele faz é definir a variável de ambiente GEM_HOME e seu diretório bin para o seu caminho. Como depende da versão ruby, certifique-se de chamá-la após "rvm". Como cada diretório de layout ruby ​​possui seu próprio GEM_HOME, você não precisa usar os gemsets do rvm.

PATH_add precede e expande o caminho relativo fornecido. Nesse caso, eu uso isso para separar os binstubs do bundler dos meus próprios scripts bin combundle install --binstubs .direnv/bundler-bin

Se você quiser descobrir exatamente o que esses comandos fazem, por enquanto: cat direnv stdlib| Menos

Shin Kim
fonte
2
Embora esse link possa responder à pergunta, é melhor incluir aqui as partes essenciais da resposta e fornecer o link para referência. As respostas somente para links podem se tornar inválidas se a página vinculada for alterada. - Revisão
jezrael
@ jezrael Obrigado pelo seu comentário!
21716 Shin Kim
1
Super, não tem problema.
Jezrael
1

Mineshaft é um projeto em que trabalho há algum tempo e continuo trabalhando no desenvolvimento.

Ele oferece a capacidade de criar ambientes virtuais semelhantes ao funcionamento do virtualenv e também pode instalar o Ruby globalmente.

ctesterman
fonte