Soy un principiante en Ruby on Rails y estoy usando Rails 3.0.9.
¿Cuál es la diferencia entre Gemfile
y Gemfile.lock
en Rails?
fuente
Soy un principiante en Ruby on Rails y estoy usando Rails 3.0.9.
¿Cuál es la diferencia entre Gemfile
y Gemfile.lock
en Rails?
Aquí Gemfile
es donde especifica qué gemas desea usar, y le permite especificar qué versiones.
El Gemfile.lock
archivo es donde Bundler registra las versiones exactas que se instalaron. De esta manera, cuando se carga la misma biblioteca / proyecto en otra máquina, la ejecución bundle install
examinará Gemfile.lock
e instalará las mismas versiones exactas, en lugar de solo usar Gemfile
e instalar las versiones más recientes. (Ejecutar diferentes versiones en diferentes máquinas podría llevar a pruebas rotas, etc.) Nunca debería tener que editar directamente el archivo de bloqueo.
Consulte el Propósito y la justificación de Bundler , específicamente la sección Verificar su código en el Control de versiones.
Gemfile.lock
incluye versiones "abiertas" en algunos casos (por ejemplo,rails (4.0.0)
requierebundler (>= 1.3.0, < 2.0)
), lo que causa problemas. ¿Alguna idea de cómo evitar esas dependencias 'abiertas'?Por lo general, escribimos dependencias en Gemfile como:
Aquí básicamente dices: " Quiero nokogiri siempre que sea mayor que la versión 1.4.4 ", etc. Ahora supongamos que configuré mi hace
Gemfile
8 meses y configuré mi aplicación con este requisito. Hace 8 meses la versión nokogiri era 1.4.4 . Mis aplicaciones de rieles funcionaban perfectamente sin ningún problema con esta versión.Ahora piensa que estoy tratando de construir con lo mismo
Gemfile
. Pero si miramos las versiones de nokogiri , vemos que la versión estable actual ha cambiado a 1.4.9 . Eso significa que si intentamos construir, el paquete instalará la versión 1.4.9 de nokogiri (supongamos que no tenemosGemfile.lock
).Qué significa eso ?
Como ves si no tienes ninguno
Gemfile.lock
y ejecuta:entonces las gemas utilizadas actualmente pueden ser diferentes en cualquier momento . Su aplicación utilizaba la versión 1.4.4 y funciona hace 8 meses sin ningún problema, pero si intenta compilarla ahora obtendrá la versión 1.4.9 . Tal vez está roto con la última versión de
nokogiri
, la increíble característica que usó con 1.4.4 no está más disponible, etc.Para evitar este tipo de problema
Gemfile.lock
se utiliza. EnGemfile.lock
solamente las versiones exactas son escritas y por lo tanto sólo éstos serán instalados. Eso significa que si distribuye su aplicación con unGemfile.lock
, cada máquina tendrá las mismas gemas instaladas y lo más importante es que todas obtienen la misma versión . Esto le dará una pila de implementación estable y común.¿Cómo se crea Gemfile.lock?
Se crea automáticamente con el primero:
mando. Después de eso, cada vez que ejecute
bundle install
, el paquete primero buscaráGemfile.lock
e instalará las gemas especificadas allí. Es un hábito distribuir este archivo entre sus proyectos para proporcionar coherencia y estabilidad.¿Cómo actualizar Gemfile.lock?
Si está satisfecho con la última versión de sus aplicaciones, puede actualizarla
Gemfile.lock
. Solo refleja tus cambios aGemfile
. Eso significa cambiar las dependencias a las nuevas versiones exactas enGemfile
. Después de esa carrera:Esto lo actualizará
Gemfile.lock
con su versión más reciente de aplicaciones.fuente
nokogiri ~> 1.4.4
no permitiría1.5.3
ser instalado; max permitido sería1.4.x
dondex>=4
(para nokogiri sería1.4.7
). El~>
operador significa que solo el último dígito en la gema utilizada puede ser "mayor que" la versión dada. Por ejemplo,foo ~> a.b.c.d
significa que cualquier versión defoo
está bien siempre y cuando siga siendo abc {something} donde {something}>=
d. Ver también la pregunta relacionadagem "nokogiri", "~> 1.4.4"
al usarlas en el archivo de gemas. ¿Por qué el paquete no podía usar esa versión? ¿Es porque está diseñado para instalar intencionalmente las últimas versiones de la gema por defecto?~> 1.4.4
es equivalente a>= 1.4.4 and < 1.5
. Ver bundler.io/v1.5/gemfile.html . Para una versión exacta, solo usegem 'foo', '1.4.4'
.bundle install
verificaráGemfile
incluso si hay unaGemfile.lock
y aplicará nuevas restriccionesGemfile.lock
?El Gemfile.lock
Cuando ejecuta la instalación del paquete, Bundler conservará los nombres completos y las versiones de todas las gemas que utilizó (incluidas las dependencias de las gemas especificadas en el Gemfile (5)) en un archivo llamado Gemfile.lock.
Bundler usa este archivo en todas las llamadas posteriores a la instalación de paquetes, lo que garantiza que siempre use el mismo código exacto, incluso cuando su aplicación se mueva a través de las máquinas.
Debido a la forma en que funciona la resolución de dependencias, incluso un cambio aparentemente pequeño (por ejemplo, una actualización a una liberación puntual de una dependencia de una gema en su Gemfile (5)) puede resultar en que se necesiten gemas radicalmente diferentes para satisfacer todas las dependencias.
Como resultado, DEBE verificar su Gemfile.lock en el control de versiones. Si no lo hace, cada máquina que revisa su repositorio (incluido su servidor de producción) resolverá todas las dependencias nuevamente, lo que resultará en el uso de diferentes versiones de código de terceros si alguna de las gemas en el Gemfile (5) o cualquiera de sus dependencias han sido actualizadas.
fuente