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?

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.


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

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 .


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 .


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.


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

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


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.