2010-11-11 21 views
430

Soy una especie de nuevo en bundler y los archivos que genera. Tengo una copia de un git repo de GitHub a la que contribuyen muchas personas, así que me sorprendió descubrir que el bundler creó un archivo que no existía en el repositorio y que no estaba en la lista .gitignore.¿Debería incluirse Gemfile.lock en .gitignore?

Como lo he bifurcado, sé que agregarlo al repositorio no afectará nada al repositorio principal, pero si hago una solicitud de extracción, ¿habrá algún problema?

¿Debe incluirse Gemfile.lock en el repositorio?

+0

Relacionado: http://stackoverflow.com/questions/14034561/should-gem-file-lock-be-committed-to-source-control-on- windows – ripper234

+2

Si encontraste tu aquí porque tiene cajas de Linux y Windows que comparten el mismo repositorio, vea la respuesta de Joe Yang. En el momento de escribir esto, ocupa el tercer puesto. También vea http://stackoverflow.com/questions/14034561/should-gem-file-lock-be-committed-to-source-control-on- windows –

Respuesta

476

Suponiendo que no está escribiendo un rubygem, Gemfile.lock debe estar en su repositorio. Se usa como una instantánea de todas las gemas requeridas y sus dependencias. De esta forma, el bundler no tiene que volver a calcular todas las dependencias gemelas cada vez que implemente, etc.

Del comentario de cowboycoded.

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

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

+78

Depende de lo que esté trabajando. Si está trabajando en una gema, NO MARQUE su Gemfile.lock. Si está trabajando en una aplicación de Rails, entonces verifique su Gemfile.lock. Más información aquí - http://yehudakatz.com/2010/12/16/clarifying-the-roles-of-the-gemspec-and-gemfile/ – johnmcaliley

+0

Muy buen punto. – rwilliams

+0

Thx para un artículo útil. – a5his

11

Estando de acuerdo con r-dub, a mantenerlo en control de código fuente, pero para mí, el beneficio real es la siguiente:

colaboración en entornos idénticos (sin tener en cuenta las windohs y Linux cosas/MAC). Antes de Gemfile.lock, el siguiente tipo en instalar el proyecto podría ver todo tipo de errores confusos, culpándose a sí mismo, pero él era el tipo afortunado que obtenía la próxima versión de la súper gema, rompiendo las dependencias existentes.

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

Nota: recuerde cosas de grupo, como: desarrollo y: Prueba

46

El verdadero problema ocurre cuando se está trabajando en una aplicación de código abierto Rails que tiene que 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 necesita ser registrado con el conjunto predeterminado de gemas, pero tengo que ignorar los cambios que le he hecho en mi máquina. Para lograr esto, corro:

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

y al revés:

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

También es útil incluir algo así como el siguiente código en su Gemfile. Esto carga la joya del adaptador de base de datos apropiado, en función de 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 me funciona bien.

+1

+1 gracias por esta entrada. – DJTripleThreat

+2

Información muy útil ... no estoy seguro de por qué solo tienes 3 puntos y una respuesta menos útil tiene 50 puntos. Oh, sí, mira los sellos de fecha. (Uno de los grandes fracasos de SO son los beneficios desproporcionados que se acumulan al responder poco después de que se formula la pregunta). – iconoclast

+1

@iconoclast: Estoy realmente contento de que hayas publicado lo que hiciste. Creo que mucha gente que viene a este post, incluido yo mismo, está "cegada" por el título de la pregunta. Ahora me doy cuenta de que mi respuesta solo responde a un caso de uso específico y no necesariamente la respuesta correcta a esta pregunta. Trabajaré para actualizarlo en el futuro cercano. Dicho esto, el OP no debería haber marcado mi respuesta como correcta si no satisfacía sus necesidades. – rwilliams

31

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 repositorio y crear Gemfile.lock.server en git repo, al igual que database.yml. Entonces, antes de desplegarlo en el servidor, copiamos Gemfile.lock.server a Gemfile.lock en el servidor utilizando la tapa desplegar el gancho

+5

Tengo una aplicación que desarrollo en OSX y luego tengo que implementarla en un servidor de Windows. El seguimiento de Gemfile.lock con git resultó ser una mala idea, así que fue en mi archivo .gitignore. Muchas gemas requieren diferentes versiones para los diferentes entornos. Idealmente deberías evitar estar en esta situación, pero no tuve elección (¡maldito departamento!) – brad

9

Los documentos Bundler abordar esta cuestión, así:

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

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

Ver la sección "Comprobación de Código en control de versiones":

Después de desarrollar su aplicación para un wh ile, verifique en la aplicación junto con la instantánea Gemfile y Gemfile.lock. Ahora, su repositorio tiene un registro de las versiones exactas de todas las gemas que utilizó la última vez que estuvo seguro de que la aplicación funcionó. Tenga en cuenta que mientras su Gemfile enumera solo tres gemas (con distintos grados de severidad de versión), su aplicación depende de en docenas de gemas, una vez que toma en consideración todos los requisitos implícitos de las gemas de las que depende.

Esto es importante: el Gemfile.lock hace que su aplicación un solo paquete tanto de su propio código y el código de terceros que corrió la última vez que sabe con seguridad que todo funcionaba. Especificar las versiones exactas del código de terceros del que dependa en su Gemfile sería que no ofrecen 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, el paquete 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 dentro de él. Esos archivos son específicos de cada máquina en particular y se usan para persistir las opciones de instalación entre las ejecuciones del comando de instalación del paquete .

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

+0

Buena explicación, gracias. – akostadinov

3

Llegué un poco tarde a la fiesta, pero las respuestas me tomaron tiempo y lecturas foráneas para comprender este problema. Por lo tanto, quiero resumir lo que descubrí sobre Gemfile.lock.

Cuando está construyendo una aplicación de Rails, está utilizando ciertas versiones de gemas en su máquina local. Si desea evitar errores en el modo de producción y otras ramas, debe usar ese archivo Gemfile.lock en todas partes y decirle a bundler bundle para reconstruir 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 que el cambio de archivos y escribir git pull nuevo.

+0

Si un archivo cambia automáticamente, p. mediante un proceso de compilación, es una señal clara de que no debe agregarse al control de versiones. –

3

Sin Gemfile.lock significa:

  • nuevos contribuyentes no pueden ejecutar las pruebas porque las cosas extrañas fallan, por lo que no van a contribuir o recibir RP en su defecto ... mala primera experiencia.
  • no se puede volver a proyecto de un año de edad hacha y corregir un error sin tener que actualizar/reescribir el proyecto si perdió su Gemfile.lock locales

-> Compruebe siempre en Gemfile.lock, hacen Travis eliminar si quieres ser extra completo https://grosser.it/2015/08/14/check-in-your-gemfile-lock/

Cuestiones relacionadas