Eu sou iniciante no Ruby on Rails e estou usando o Rails 3.0.9.
Qual é a diferença entre Gemfile
e Gemfile.lock
no Rails?
fonte
Eu sou iniciante no Ruby on Rails e estou usando o Rails 3.0.9.
Qual é a diferença entre Gemfile
e Gemfile.lock
no Rails?
O Gemfile
é onde você especificar quais gemas você quer usar, e permite que você especifique quais versões.
O Gemfile.lock
arquivo é onde o Bundler registra as versões exatas que foram instaladas. Dessa forma, quando a mesma biblioteca / projeto é carregada em outra máquina, a execução bundle install
examinará Gemfile.lock
e instalará exatamente as mesmas versões, em vez de apenas usar Gemfile
e instalar as versões mais recentes. (A execução de versões diferentes em máquinas diferentes pode levar a testes quebrados, etc.) Você nunca precisa editar diretamente o arquivo de bloqueio.
Confira Objetivo e justificativa do Bundler , especificamente a seção Verificando seu código no controle de versão.
Gemfile.lock
inclui versões 'abertas' em alguns casos (por exemplo,rails (4.0.0)
requerbundler (>= 1.3.0, < 2.0)
), o que causa problemas. Alguma idéia de como evitar essas dependências "abertas"?Normalmente, escrevemos dependências no Gemfile como:
Aqui você basicamente diz: " Quero nokogiri, contanto que seja maior que a versão 1.4.4 ", etc. Agora, suponha que eu configurei meus
Gemfile
8 meses atrás e que eu configurei com êxito meu aplicativo com esse requisito. 8 meses atrás a versão nokogiri era 1.4.4 . Meus aplicativos rails estavam funcionando perfeitamente sem problemas com esta versão.Agora pense que estou tentando construir com o mesmo
Gemfile
. Mas se olharmos para as versões nokogiri , vemos que a versão estável atual mudou para 1.4.9 . Isso significa que, se tentarmos construir, o bundler instalará a versão 1.4.9 do nokogiri (suponha que não tenhamosGemfile.lock
).O que isso significa ?
Como você vê se não possui nenhum
Gemfile.lock
e execute:em seguida, as pedras preciosas usadas atualmente pode ser diferente a qualquer momento . Seu aplicativo usou a versão 1.4.4 e funciona há 8 meses sem problemas, mas se você tentar compilá-lo agora, obterá a versão 1.4.9 . Talvez esteja quebrado com a versão mais recente do
nokogiri
, o recurso incrível que você usou com 1.4.4 não está mais disponível, etc.Para evitar esse tipo de problema,
Gemfile.lock
é usado. NaGemfile.lock
única as versões exatas são escritos e, portanto, só estes serão instalados. Isso significa que, se você distribuir seu aplicativo com umGemfile.lock
, cada máquina terá as mesmas jóias instaladas e, o mais importante , todas elas terão a mesma versão . Isso fornecerá uma pilha de implantação estável e comum.Como é criado o Gemfile.lock?
É criado automaticamente com o primeiro:
comando. Depois disso, toda vez que você executa
bundle install
, o bundle primeiro procuraGemfile.lock
e instala as gemas especificadas lá. É um hábito distribuir esse arquivo entre seus projetos para fornecer consistência e estabilidade.Como atualizar Gemfile.lock?
Se você estiver satisfeito com a versão mais recente dos seus aplicativos, poderá atualizar
Gemfile.lock
. Apenas reflita suas alterações emGemfile
. Isso significa alterar as dependências para as novas versões exatas emGemfile
. Depois dessa execução:Isso atualizará você
Gemfile.lock
com sua versão mais recente dos aplicativos.fonte
nokogiri ~> 1.4.4
não permitiria1.5.3
a instalação; max permitido seria1.4.x
ondex>=4
(para nokogiri isso seria1.4.7
). O~>
operador significa que apenas o último dígito na gema usada pode ser "maior que" a versão fornecida. Por exemplo,foo ~> a.b.c.d
significa que qualquer versão defoo
está bem, desde que ainda esteja abc {algo} onde {algo}>=
d. Veja também a pergunta relacionadagem "nokogiri", "~> 1.4.4"
o gemfile. Por que o empacotador não pôde usar essa versão? É porque foi projetado para instalar intencionalmente as versões mais recentes da gema por padrão?~> 1.4.4
é equivalente a>= 1.4.4 and < 1.5
. Consulte bundler.io/v1.5/gemfile.html . Para uma versão exata, basta usargem 'foo', '1.4.4'
.bundle install
verificará oGemfile
mesmo se houver umGemfile.lock
e aplicará novas restriçõesGemfile.lock
?O Gemfile.lock
Quando você executa a instalação do pacote configurável, o Bundler mantém os nomes e versões completos de todas as gemas que você usou (incluindo dependências das gemas especificadas no Gemfile (5)) em um arquivo chamado Gemfile.lock.
O empacotador usa esse arquivo em todas as chamadas subseqüentes para instalar o pacote, o que garante que você sempre use o mesmo código exato, mesmo quando o aplicativo se move pelas máquinas.
Devido à maneira como a resolução de dependência funciona, mesmo uma alteração aparentemente pequena (por exemplo, uma atualização para o lançamento pontual de uma dependência de uma gema no seu Gemfile (5)) pode resultar em gemas radicalmente diferentes sendo necessárias para satisfazer todas as dependências.
Como resultado, você deve verificar seu Gemfile.lock no controle de versão. Caso contrário, todas as máquinas que fizerem check-out do seu repositório (incluindo o servidor de produção) resolverão todas as dependências novamente, o que resultará em diferentes versões do código de terceiros sendo usadas se alguma das gemas no Gemfile (5) ou qualquer outra de suas dependências foram atualizadas.
fonte