Actualización de una dependencia
Por supuesto, en algún momento, es posible que desee actualizar la versión de una dependencia particular de la que depende su aplicación. Por ejemplo, podría querer actualizarrails
a 3.0.0
final. Es importante destacar que el hecho de que actualices una dependencia no significa que quieras volver a resolver todas las dependencias y utilizar la última versión de todo. En nuestro ejemplo, sólo tiene tres dependencias, pero incluso en este caso, la actualización de todo puede causar complicaciones.
Para ilustrar, la gema rails 3.0.0.rc
depende de la gema actionpack 3.0.0.rc
, que depende de rack ~> 1.2.1
(lo que significa >= 1.2.1
y ). The
rack-cache
gema depende derack >= 0.4
. Supongamos que la gema final rails 3.0.0
también depende de rack ~> 1.2.1
, y que desde la publicación de rails 3.0.0
, el equipo de Rack publicó rack 1.2.2
.
Si actualizamos ingenuamente todas nuestras gemas para actualizar Rails, obtendremos rack 1.2.2
, que satisface los requisitos tanto de rails 3.0.0
como derack-cache
. Sin embargo, no hemos pedido específicamente que se actualice rack-cache
, que puede no ser compatible con rack 1.2.2
(por la razón que sea). Y aunque una actualización de rack 1.2.1
a rack 1.2.2
probablemente no rompa nada, pueden darse situaciones similares que impliquen saltos mucho mayores. (ver más abajo para una discusión más amplia)
Para evitar este problema, cuando se actualiza una gema, bundler no actualizará una dependencia de esa gema si otra gema todavía depende de ella. En este ejemplo, comorack-cache
todavía depende de rack
, bundler no actualizará la gemarack
. Esto asegura que la actualización de rails
no rompa involuntariamente rack-cache
. Como la dependenciaactionpack 3.0.0
de rails 3.0.0
sigue siendo compatible con rack 1.2.1
, bundler la deja en paz, y rack-cache
sigue funcionando incluso ante una incompatibilidad con rack 1.2.2
.
Dado que originalmente declaró una dependencia en rails 3.0.0.rc
, si desea actualizar a rails 3.0.0
, simplemente actualice su Gemfile
agem 'rails', '3.0.0'
y ejecute:
$ bundle install
Como se describió anteriormente, el comando bundle install
siempre hace una actualización conservadora, negándose a actualizar gemas (o sus dependencias) que no ha cambiado explícitamente en el Gemfile
. Esto significa que si no modificarack-cache
en su Gemfile
, bundler lo tratará **y sus dependencias** (rack
) como una sola unidad no modificable. Si rails 3.0.0
era incompatible con rack-cache
, bundler informará de un conflicto entre sus dependencias instantáneas (Gemfile.lock
) y su Gemfile
actualizado.
Si actualiza su Gemfile
, y su sistema ya tiene todas las dependencias necesarias, bundler actualizará de forma transparente el Gemfile.lock
cuando arranque su aplicación. Por ejemplo, si añade mysql
a su Gemfile
, y ya lo ha instalado en su sistema, puede arrancar su aplicación sin ejecutar bundle install
, y bundler persistirá la «última configuración buena conocida» a la instantánea Gemfile.lock
.
Esto puede ser útil cuando se añaden o actualizan gemas con dependencias mínimas (databasedrivers, wirble
, ruby-debug
). Probablemente fallará si actualizas gemas con dependencias significativas (rails
), o de las que dependen muchas gemas (rack
). Si una actualización transparente falla, tu aplicación no arrancará, y bundler imprimirá un error indicándote que ejecutes bundle install
.