Cuál es la diferencia entre Gemfile y Gemfile.bloqueo en Rubí sobre rieles


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?

Author: brianmearns, 2011-08-03

3 answers

El Gemfile es donde se especifican las gemas que desea usar, y le permite especificar qué versiones.

El archivo Gemfile.lock es donde Bundler registra las versiones exactas que se instalaron. De esta manera, cuando la misma biblioteca/proyecto se carga en otra máquina, ejecutando bundle install mirará la Gemfile.lock e instalará exactamente las mismas versiones, en lugar de usar la Gemfile e instalar las versiones más recientes. (Ejecutar diferentes versiones en diferentes máquinas podría dar lugar a pruebas rotas, etc.) Nunca debería tener que editar directamente el archivo de bloqueo.

Echa un vistazo a Propósito y Justificación de Bundler, específicamente la Comprobación de Su Código en la sección de Control de Versiones.

 132
Author: Dylan Markow,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-29 14:02:14

Normalmente escribimos dependencias en Gemfile como:

gem "nokogiri", "~> 1.4.4"
gem 'bcrypt-ruby', '~> 3.0.0'
gem 'uglifier', '>= 1.2.3'
..

Aquí básicamente dices: " Quiero nokogiri siempre y cuando sea mayor que la versión 1.4.4", etc. Ahora supongamos que he establecido mi Gemfile 8 hace meses y he configurado correctamente mi aplicación con este requisito. hace 8 meses nokogiri version was 1.4.4. Mis aplicaciones rails funcionaban perfectamente sin ningún problema con esta versión.

Ahora creo que estoy tratando de construir con el mismo Gemfile. Pero si mira nokogiri versiones vemos que la versión estable actual ha cambiado a 1.4.9. Eso significa que si intentamos construir, bundler instalará la versión 1.4.9 de nokogiri (supongamos que no tenemos Gemfile.lock).

, ¿Qué significa ?

Como ves si no tienes ninguna Gemfile.lock y corres:

bundle install

Entonces las gemas utilizadas actualmente pueden ser diferentes en cualquier momento. Su aplicación se utiliza la versión 1.4.4 y funciona hace 8 meses sin ningún problema, pero si intentas construirlo ahora obtienes la versión 1.4.9. Tal vez está roto con la última versión de nokogiri, la característica impresionante que utilizó con1.4.4 no está más disponible, etc..

Para evitar este tipo de problemas se usa Gemfile.lock. En Gemfile.locksolo se escriben las versiones exactas y por lo tanto solo se instalarán estas. Eso significa que si distribuye su aplicación con un Gemfile.lock, cada máquina tendrá las mismas gemas instaladas y lo más importante todos obtienen la misma versión. Esto le dará una pila de implementación estable y común.

Cómo es Gemfile.bloqueo creado?

Se crea automáticamente con la primera:

bundle install

Comando. Después de eso cada vez que ejecute bundle install, bundle buscará primero Gemfile.lock e instalará las gemas especificadas allí. Es un hábito distribuir este archivo entre sus proyectos para proporcionar consistencia y estabilidad.

Cómo actualizar Gemfile.de bloqueo?

Si está satisfecho con la última versión de sus aplicaciones, puede actualizar Gemfile.lock. Simplemente refleja tus cambios en Gemfile. Eso significa cambiar las dependencias a las nuevas versiones exactas en Gemfile. Después de esa carrera:

bundle install

Esto te actualizará Gemfile.lock con tu versión más reciente de las aplicaciones.

 133
Author: Fatih Arslan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-17 14:44:35

El Gemfile.lock

Cuando ejecute bundle install, Bundler conservará los nombres completos y las versiones de todas las gemas que haya utilizado (incluidas las dependencias de las gemas especificadas en el Gemfile(5)) en un archivo llamado Gemfile.bloqueo.

Bundler utiliza este archivo en todas las llamadas posteriores a bundle install, lo que garantiza que siempre use el mismo código exacto, incluso cuando su aplicación se mueve entre máquinas.

Debido a la forma en que funciona la resolución de dependencias, incluso un pequeño cambio(por ejemplo, una actualización a un punto de liberación 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, debería revisar su Gemfile.fije el control de versiones. Si no lo hace, cada máquina que comprueba su repositorio (incluido su servidor de producción) resolverá todas las dependencias de nuevo, lo que dará lugar a diferentes versiones de código de terceros que se utilizan si alguna de las gemas en el Gemfile (5) o cualquiera de sus dependencias han sido actualizadas.

 3
Author: Ajey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-07 12:06:35