git version-control bundler

¿Debería incluirse Gemfile.lock en.gitignore?



version-control bundler (7)

Soy algo nuevo en bundler y los archivos que genera. Tengo una copia de un repositorio git de GitHub en el que muchas personas están contribuyendo, así que me sorprendió descubrir que Bundler creó un archivo que no existía en el repositorio y no estaba en la lista de .gitignore .

Ya que lo he bifurcado, sé que agregarlo al repositorio no romperá nada para el repositorio principal, pero si hago una solicitud de extracción, ¿causará un problema?

¿ Gemfile.lock incluirse Gemfile.lock en el repositorio?


De acuerdo con r-dub, manténgalo en el control de código fuente, pero para mí, el beneficio real es este:

colaboración en entornos idénticos (sin tener en cuenta las cosas de windohs y linux / mac). Antes de Gemfile.lock, el próximo tipo que instale el proyecto podría ver todo tipo de errores confusos, culpándose a sí mismo, pero era solo ese tipo con suerte que obtiene la próxima versión de la super gema, rompiendo las dependencias existentes.

Peor aún, esto sucedió en los servidores, obteniendo una versión no probada a menos que sea disciplinado e instale la versión exacta. Gemfile.lock lo hace explícito y le dirá explícitamente que sus versiones son diferentes.

Nota: recuerda agrupar cosas, como: desarrollo y: prueba


El problema real ocurre cuando está trabajando en una aplicación de código abierto de Rails que necesita tener un adaptador de base de datos configurable. Estoy desarrollando la rama Rails 3 de Fat Free CRM. Mi preferencia es postgres, pero queremos que la base de datos predeterminada sea mysql2.

En este caso, Gemfile.lock aún debe registrarse con el conjunto predeterminado de gemas, pero debo ignorar los cambios que he realizado en mi máquina. Para lograr esto, corro:

git update-index --assume-unchanged Gemfile.lock

y para revertir:

git update-index --no-assume-unchanged Gemfile.lock

También es útil incluir algo como el siguiente código en su Gemfile . Esto carga la gema de adaptador de base de datos adecuada, basada en su database.yml.

# Loads the database adapter gem based on config/database.yml (Default: mysql2) # ----------------------------------------------------------------------------- db_gems = {"mysql2" => ["mysql2", ">= 0.2.6"], "postgresql" => ["pg", ">= 0.9.0"], "sqlite3" => ["sqlite3"]} adapter = if File.exists?(db_config = File.join(File.dirname(__FILE__),"config","database.yml")) db = YAML.load_file(db_config) # Fetch the first configured adapter from config/database.yml (db["production"] || db["development"] || db["test"])["adapter"] else "mysql2" end gem *db_gems[adapter] # -----------------------------------------------------------------------------

No puedo decir si esto es una buena práctica establecida o no, pero funciona bien para mí.


Los documentos de Bundler también abordan esta pregunta:

ORIGINAL: http://gembundler.com/v1.3/rationale.html

EDITAR: http://web.archive.org/web/20160309170442/http://bundler.io/v1.3/rationale.html

Consulte la sección llamada "Comprobación de su código en el control de versiones":

Después de desarrollar su aplicación por un tiempo, regístrese en la aplicación junto con la instantánea Gemfile y Gemfile.lock. Ahora, tu repositorio tiene un registro de las versiones exactas de todas las gemas que usaste la última vez que sabes con seguridad que la aplicación funcionó. Tenga en cuenta que si bien su Gemfile enumera solo tres gemas (con diversos grados de rigurosidad de versión), su aplicación depende de docenas de gemas, una vez que tenga en cuenta todos los requisitos implícitos de las gemas en las que depende.

Esto es importante: el Gemfile.lock hace que su aplicación sea un paquete único de su propio código y del código de terceros que se ejecutó la última vez que está seguro de que todo funcionó. Especificar versiones exactas del código de terceros del que depende en su Gemfile no proporcionaría la misma garantía, porque las gemas generalmente declaran un rango de versiones para sus dependencias.

La próxima vez que ejecute bundle install en la misma máquina, bundler verá que ya tiene todas las dependencias que necesita y omitirá el proceso de instalación.

No verifique en el directorio .bundle, ni en ninguno de los archivos que contiene. Esos archivos son específicos de cada máquina en particular y se utilizan para conservar las opciones de instalación entre ejecuciones del comando de instalación en paquete.

Si ha ejecutado un paquete, las gemas (aunque no las git) requeridas por su paquete se descargarán en el proveedor / caché. Bundler puede ejecutarse sin conectarse a Internet (o al servidor RubyGems) si todas las gemas que necesita están presentes en esa carpeta y registradas en su control de fuente. Este es un paso opcional, y no se recomienda, debido al aumento en el tamaño del repositorio de control de origen.


Mis compañeros de trabajo y yo tenemos diferentes Gemfile.lock, porque usamos diferentes plataformas, Windows y Mac, y nuestro servidor es Linux.

Decidimos eliminar Gemfile.lock en repo y crear Gemfile.lock.server en git repo, al igual que database.yml. Luego, antes de implementarlo en el servidor, copiamos Gemfile.lock.server a Gemfile.lock en el servidor usando el gancho de despliegue de tapa


No Gemfile.lock significa:

  • los nuevos contribuyentes no pueden realizar pruebas porque las cosas raras fallan, por lo que no contribuirán ni obtendrán RP de fracaso ... mala primera experiencia.
  • no puede volver al proyecto de años anteriores y corregir un error sin tener que actualizar / reescribir el proyecto si perdió su Gemfile.lock local

-> Siempre verifique en Gemfile.lock, haga que travis lo elimine si desea ser más exhaustivo https://grosser.it/2015/08/14/check-in-your-gemfile-lock/


Suponiendo que no estés escribiendo un rubygem, Gemfile.lock debería estar en tu repositorio. Se utiliza como una instantánea de todas sus gemas requeridas y sus dependencias. De esta manera, Bundler no tiene que volver a calcular todas las dependencias de gemas cada vez que implementa, etc.

Del comentario de cowboycoded.

Si está trabajando en una gema, NO ingrese su Gemfile.lock.

Aquí hay un buen article explica qué es el archivo de bloqueo.


Un poco tarde para la fiesta, pero las respuestas todavía me tomaron tiempo y lecturas extranjeras para entender este problema. Así que quiero resumir lo que he descubierto sobre Gemfile.lock.

Cuando estás creando una aplicación Rails, estás usando ciertas versiones de gemas en tu máquina local. Si desea evitar errores en el modo de producción y en otras ramas, debe usar ese archivo Gemfile.lock en todas partes y decirle a Bundler que agrupe las gemas cada vez que cambie.

Si Gemfile.lock ha cambiado en su máquina de producción y Git no le permite git pull , debe escribir git reset --hard para evitar ese cambio de archivo y escribir git pull nuevamente.