Atualizando uma dependência
Obviamente, em algum momento, você pode querer atualizar a versão de uma dependência em particular na qual sua aplicação depende. Por exemplo, você pode querer atualizarrails
para 3.0.0
final. Importante, só porque você está atualizando uma dependência, isso não significa que você queira re-resolver todas as suas dependências e usar a última versão de tudo. No nosso exemplo, você só tem três dependências, mas mesmo neste caso, atualizar tudo pode causar complicações.
Para ilustrar, a gema rails 3.0.0.rc
depende de actionpack 3.0.0.rc
gema, que depende de rack ~> 1.2.1
(que significa >= 1.2.1
e ). The
rack-cache
gema depende derack >= 0.4
. Vamos supor que a gema rails 3.0.0
final também depende de rack ~> 1.2.1
, e que desde o lançamento de rails 3.0.0
, a equipe do Rack lançou rack 1.2.2
.
Se atualizarmos ingenuamente todas as nossas gemas para atualizar o Rails, teremos rack 1.2.2
, o que satisfaz os requisitos de rails 3.0.0
e rack-cache
. Entretanto, não pedimos especificamente para atualizarrack-cache
, o que pode não ser compatível com rack 1.2.2
(por qualquer razão). E embora uma atualização de rack 1.2.1
para rack 1.2.2
provavelmente não quebre nada, cenários similares podem acontecer que envolvam saltos muito maiores. (veja abaixo para uma discussão maior)
A fim de evitar este problema, quando você atualiza uma gema, o bundler não atualizará a adependência dessa gema se outra gema ainda depender dela. Neste exemplo, já querack-cache
ainda depende de rack
, o bundler não atualizará a gemarack
. Isso garante que a atualização rails
não irá quebrar de forma tinadente rack-cache
. Como rails 3.0.0
a dependência de actionpack 3.0.0
permanece compatível com rack 1.2.1
, o bundler deixa a gema sozinha, e rack-cache
continua a funcionar mesmo em face de uma incompatibilidade com rack 1.2.2
.
Desde que você declarou originalmente uma dependência em rails 3.0.0.rc
, se você quiser atualizar para rails 3.0.0
, simplesmente atualize seu Gemfile
paragem 'rails', '3.0.0'
e execute:
$ bundle install
Como descrito acima, o comando bundle install
sempre faz uma atualização conservadora, recusando-se a atualizar gemas (ou suas dependências) que você não tenha trocado explicitamente no Gemfile
. Isto significa que se você não modificarrack-cache
no seu Gemfile
, o bundler irá tratá-lo ** e suas dependências*** (rack
) como uma unidade única e inalterável. Se rails 3.0.0
foi incompatível com rack-cache
, o bundler irá reportar um conflito entre as suas dependências instantâneas (Gemfile.lock
) e as suas actualizadas Gemfile
.
Se você actualizar o seu Gemfile
, e o seu sistema já tiver todas as dependências necessárias, o bundler irá actualizar de forma transparente o Gemfile.lock
quando iniciar a sua aplicação. Por exemplo, se você adicionar mysql
ao seu Gemfile
, e já o tiver instalado em seu sistema, você pode inicializar sua aplicação sem executar bundle install
, e o bundler irá persistir a configuração do “último bem conhecido” para o Gemfile.lock
snapshot.
Isto pode vir a ser útil ao adicionar ou atualizar gemas com dependências mínimas (databaserivers, wirble
, ruby-debug
). Provavelmente falhará se você atualizar gemas com dependências significativas (rails
), ou que um monte de gemas dependem de (rack
). Se uma atualização transparente falhar, sua aplicação irá falhar para inicializar, e o bundler irá imprimir um erro instruindo-o a executar bundle install
.
.