Como faço para “ativar” uma versão diferente de uma joia em particular?

85

Eu quero alternar entre os trilhos 2.3.10 como a gema "ativa" do meu sistema operacional, para poder invocá-lo na linha de comando.

É possível fazer isso? Não estou usando o rvm. Talvez seja hora de começar.

Eu tentei gem install rails --version=2.3.10, mas isso só garante que a versão da gema está instalada, não a coloca /usr/bin/rails.

(Eu já uso o bundler para meus aplicativos - mas não precisava de nenhum controle preciso sobre as gemas no nível do sistema operacional até agora)

John Bachir
fonte

Respostas:

154

Se o seu problema for executar binários de uma determinada versão, então:

rails --version # => the latest version
rails _2.3.10_ --version # => Rails 2.3.10

Este pattern ( gem-binary _gem-version_) funciona para qualquer binário gem.

Espero que ajude.

Daniel Vartanov
fonte
1
Oh, isso acabou de me poupar um longo fim de semana no escritório, obrigado!
Lachlan McD.
2
Isso não parece funcionar para todos eles: rackup _1.4.3_ --version<br> Rack 1.1 (Release: 1.4)
Chloe
1
rackup imprime apenas a versão de lançamento (consulte Rack.versione Rack.release github.com/rack/rack/blob/master/lib/rack.rb ). Experimente gem install rack --version=1.3 && rackup _1.3.0_ --version, vai imprimirRack 1.1 (Release: 1.3)
Daniel Vartanov
E, para garantir, é assim que funciona:which rackup | xargs cat
Daniel Vartanov
12

Use RVM

RVM permite que você gerencie diferentes versões de Ruby e Gems. Você pode instalar uma versão do ruby ​​usando, por exemplo

rvm install 1.9.2

Você pode usá-lo usando:

rvm use 1.9.2

Use gemas específicas por projeto com conjuntos de gemas.

Se você quiser mais namespacing, pode configurar conjuntos de joias; diretórios que conterão gemas específicas para um projeto específico.

rvm gemset create myproject

então você pode usá-los assim:

rvm use 1.9.2@myproject

Automação

Para automatizar o processo de troca de gemas, coloque os arquivos .ruby-version e .ruby-gemset na raiz do projeto. Abra a versão do Ruby e o nome do gemset que deseja usar dentro deles e o RVM selecionará o gemset correto quando você colocar o cd no diretório do projeto.

Instalando joias em seu conjunto de joias

Instale suas gemas em seu conjunto de gemas da maneira usual usando o bundler se você estiver usando:

bundle install

ou apenas usando o antigo normal:

gem install mygem

As joias irão no conjunto de joias certo.

Alternativas RVM

Você também pode verificar o rbenv, que faz um trabalho semelhante.

superluminário
fonte
1
O problema com o rvm é (como você mencionou) que ele lida com versões ruby ​​e versões gem. O rbenv apenas lida com as versões ruby ​​e permite que o bundler lide com as versões gem.
elegante
7

Você pode usar RVM

Depois, você também pode usar o Bundler , que gerencia bem as dependências de gemas.

Na tua Gemfile

gem "rails", "2.3.10"

e em seu aplicativo

require 'rubygems'
require 'bundler/setup'

e pronto.

Chubas
fonte
Além disso, se você quiser que alguns scripts "vejam" apenas as versões declaradas em seu Gemfile, execute-os como "bundle exec <script-name>", por exemplobundle exec warble
rustyx
3

EDIT: Acabei de ver a sua menção RVM no post. Definitivamente, o caminho a percorrer.

Você vai querer instalar o RVM - é um pacote incrível que permite gerenciar diferentes Rubys e diferentes conjuntos de joias na mesma máquina. Você pode alternar para frente e para trás com total facilidade.

Aqui está o guia de instalação: http://rvm.beginrescueend.com/rvm/install/

Assim que tiver tudo pronto, você pode ver todos os rubys instalados na linha de comando com rvm liste alternar com rvm use ruby-head, por exemplo. O RVM mantém as joias de cada rubi separadas, o que deve ajudar com sua dúvida.

Sam Ritchie
fonte