Después de ejecutar el bundle install
comando, se crea ' Gemfile.lock ' en el directorio de trabajo. ¿Qué significan las directivas dentro de ese archivo?
Por ejemplo, tomemos el siguiente archivo:
PATH
remote: .
specs:
gem_one (0.0.1)
GEM
remote: http://example.org/
specs:
gem_two (0.0.2)
gem_three (0.0.3)
gem_four (0.0.4)
PLATFORMS
platform
DEPENDENCIES
gem_two
gem_one!
¿Qué describen ' PATH ', ' GEM ', ' PLATFORMS ' y ' DEPENDENCIES '? ¿Se requieren todos?
¿Qué debería contener los subdirectivos ' remoto ' y ' especificaciones '?
¿Qué significa el signo de exclamación después del nombre de la gema en el grupo ' DEPENDENCIAS '?
fuente
con respecto al signo de exclamación que acabo de descubrir está en gemas obtenidas a través de
:git
, por ejemplofuente
path
opción. ¿Supongo que tiene algo que ver con cargar una gema no compilada?Pasé los últimos meses jugando con Gemfiles y Gemfile.locks mucho mientras construía una herramienta de actualización de dependencia automatizada 1 . Lo siguiente está lejos de ser definitivo, pero es un buen punto de partida para comprender el formato Gemfile.lock. También es posible que desee consultar el código fuente del analizador de archivos de bloqueo de Bundler .
Encontrará los siguientes encabezados en un archivo de bloqueo generado por Bundler 1.x:
GEM (opcional pero muy común)
Estas son dependencias provenientes de un servidor Rubygems. Ese puede ser el índice principal de Rubygems, en Rubygems.org, o puede ser un índice personalizado, como los disponibles en Gemfury y otros. Dentro de esta sección verá:
remote:
una o más líneas que especifican la ubicación de los índices de Rubygemsspecs:
una lista de dependencias, con su número de versión, y las restricciones en cualquier subdependenciaGIT (opcional)
Estas son dependencias que provienen de un remoto git dado. Verá una sección diferente para cada control remoto de git, y dentro de cada sección verá:
remote:
El mando a distancia. P.ej,[email protected]:rails/rails
revision:
la referencia de confirmación a la que está bloqueado el Gemfile.locktag:
(opcional) la etiqueta especificada en el Gemfilespecs:
la dependencia de git encontrada en este control remoto, con su número de versión, y las restricciones en cualquier subdependenciaRUTA (opcional)
Estas son dependencias derivadas de un determinado
path
, proporcionado en el Gemfile. Verá una de estas secciones diferente para cada dependencia de ruta, y dentro de cada sección verá:remote:
el camino. P.ej,plugins/vendored-dependency
specs:
la dependencia de git encontrada en este control remoto, con su número de versión, y las restricciones en cualquier subdependenciaPLATAFORMAS
La plataforma Ruby contra la que se generó el Gemfile.lock. Si alguna dependencia del Gemfile especifica una plataforma, solo se incluirá en el Gemfile.lock cuando el lockfile se genera en esa plataforma (por ejemplo, a través de una instalación).
Dependencias
Una lista de las dependencias que se especifican en
Gemfile
, junto con la restricción de versión especificada allí.Las dependencias especificadas con una fuente distinta del índice principal de Rubygems (por ejemplo, dependencias git, basadas en rutas, dependencias) tienen un
!
significado que está "anclado" a esa fuente 2 (aunque a veces hay que buscar en el Gemfile para determinar en).VERSIÓN DE RUBIO (opcional)
La versión de Ruby especificada en el Gemfile, cuando se creó este Gemfile.lock. Si se especifica una versión de Ruby en un
.ruby_version
archivo, esta sección no estará presente (ya que Bundler considerará que el Gemfile / Gemfile.lock es independiente de la versión de Ruby del instalador).INCLUIDO CON (Paquete> = v1.10.x)
La versión de Bundler utilizada para crear Gemfile.lock. Se usa para recordar a los instaladores que actualicen su versión de Bundler, si es anterior a la versión que creó el archivo.
FUENTE DE PLUGIN (opcional y muy rara)
En teoría, un Gemfile puede especificar complementos de Bundler, así como gemas 3 , que luego se enumerarían aquí. En la práctica, no conozco ningún complemento disponible, a partir de julio de 2017. ¡Esta parte de Bundler todavía está en desarrollo activo!
fuente
Bundler es un administrador de gemas que proporciona un entorno consistente para proyectos de Ruby al rastrear e instalar las gemas y versiones exactas que se necesitan.
Gemfile y Gemfile.lock son productos primarios dados por Bundler gem (Bundler en sí mismo es una gema).
Gemfile contiene la dependencia de su proyecto en las gemas, que usted menciona manualmente con las versiones especificadas, pero esas gemas dependen de otras gemas que el paquete resuelve automáticamente.
Gemfile.lock contiene una instantánea completa de todas las gemas en Gemfile junto con su dependencia asociada.
Cuando llame por primera vez a la instalación de paquete , creará este Gemfile.lock y usará este archivo en todas las llamadas posteriores a la instalación de paquete, lo que garantiza que tenga todas las dependencias instaladas y omitirá la instalación de dependencia.
Lo mismo sucede cuando comparte su código con diferentes máquinas
Compartes tu Gemfile.lock junto con Gemfile, cuando ejecutas la instalación del paquete en otra máquina, se referirá a tu Gemfile.lock y omite el paso de resolución de dependencia, en su lugar, instalará las mismas gemas dependientes que usaste en el máquina original, que mantiene la consistencia en múltiples máquinas
¿Por qué necesitamos mantener la coherencia en varias máquinas?
Ejecutar diferentes versiones en diferentes máquinas podría conducir a un código roto
Supongamos que su aplicación usaba la versión 1.5.3 y funciona hace 14 meses
sin ningún problema, e intenta instalar en una máquina diferente
sin Gemfile.lock ahora obtiene la versión 1.5.8. Tal vez está roto con la última versión de algunas gemas y su aplicación
fallará. Mantener la consistencia es de suma importancia (
práctica preferida ).
También es posible actualizar gema (s) en Gemfile.lock mediante la actualización de paquete .
Esto se basa en el concepto de actualización conservadora.
fuente
Me parece que PATH enumera las dependencias de primera generación directamente de su gemspec, mientras que GEM enumera las dependencias de segunda generación (es decir, de qué dependen sus dependencias) y las de su Gemfile. PATH :: remote se
.
debe a que se basa en una gemspec local en el directorio actual para averiguar qué pertenece a PATH :: spec, mientras que GEM :: remote esrubygems.org
, ya que ahí es donde tenía que ir para averiguar qué pertenece a GEM :: Especificaciones.En un complemento de Rails, verá una sección de RUTA, pero no en una aplicación de Rails. Como la aplicación no tiene un archivo gemspec, no habría nada que poner en RUTA.
En cuanto a DEPENDENCIAS, gembundler.com afirma:
El Gemfile generado por
rails plugin new my_plugin
dice algo similar:Lo que esto significa es que la diferencia entre
y
es que (1) solo incluirá "julio" en Gemfile.lock (y, por lo tanto, en la aplicación) en un entorno de desarrollo. Entonces, cuando corras
bundle install
, verás "julio" no solo en RUTA sino también en DEPENDENCIAS, sino solo en desarrollo. En producción, no estará allí en absoluto. Sin embargo, cuando use (2), verá "julio" solo en RUTA, no en DEPENDENCIAS, pero aparecerá cuando provengabundle install
de un entorno de producción (es decir, en alguna otra gema que incluya la suya como una dependencia), no Solo desarrollo.Estas son solo mis observaciones y no puedo explicar completamente por qué nada de esto es así, pero agradezco más comentarios.
fuente
Parece que no hay un documento claro hablando sobre el
Gemfile.lock
formato. Tal vez sea porqueGemfile.lock
solo lo usa el paquete internamente.Sin embargo, dado que
Gemfile.lock
es una instantánea deGemfile
, lo que significa que toda su información debe provenirGemfile
(o del valor predeterminado si no se especifica enGemfile
).Para
GEM
, enumera todas las dependencias que introduce directa o indirectamente en elGemfile
.remote
debajoGEM
indica dónde obtener las gemas, que se especifica por fuente enGemfile
.Si no se obtiene una gema
remote
,PATH
indica la ubicación para encontrarla.PATH
's información proviene de ruta enGemfile
cuando se declara una dependencia.Y
PLATFORM
es de aquí .Para
DEPENDENCIES
, es la instantánea de las dependencias resueltas por paquete.fuente
El signo de exclamación aparece cuando la gema se instaló utilizando una fuente distinta de " https://rubygems.org ".
fuente