No hay una respuesta exacta a esto.
En términos generales, el compositor no debería estar haciendo lo que el sistema de compilación debe hacer y no debería poner composer.lock en VCS. El compositor podría tenerlo extrañamente al revés. Los usuarios finales en lugar de los productores no deberían usar archivos de bloqueo. Por lo general, su sistema de compilación mantiene instantáneas, directorios reutilizables, etc., en lugar de un directorio vacío cada vez. La gente que saca una lib del compositor puede querer que esa lib use un bloqueo para que las dependencias con las que se carga la lib se hayan probado.
Por otro lado, eso aumenta significativamente la carga de la administración de versiones, donde seguramente querrá múltiples versiones de cada biblioteca ya que las dependencias estarán estrictamente bloqueadas. Si es probable que cada biblioteca tenga una versión ligeramente diferente, entonces necesita un poco de soporte de versión de biblioteca múltiple y también puede ver rápidamente el tamaño de las dependencias necesarias, de ahí el consejo de mantenerlo en la hoja.
Tomando eso en cuenta, realmente no encuentro que los archivos de bloqueo sean útiles, ya sea bibliotecas o sus propios trabajos. Lo único que uso para mí es en mi plataforma de compilación / prueba que persiste cualquier activo adquirido externamente solo actualizándolos cuando se solicita, proporcionando compilaciones repetibles para probar, compilar e implementar. Si bien eso se puede mantener en VCS, no siempre se mantiene con el árbol de origen, los árboles de compilación estarán en otra parte de la estructura de VCS o serán administrados por otro sistema en otro lugar. Si se almacena en un VCS, es discutible si se debe mantener o no en el mismo repositorio que los árboles de origen porque de lo contrario cada extracción puede generar una gran cantidad de activos de construcción. Me gusta mucho tener todo en un repositorio bien organizado, con la excepción de la producción / credenciales sensibles y la hinchazón.
SVN puede hacerlo mejor que git, ya que no te obliga a adquirir el repositorio completo (aunque sospecho que tampoco es estrictamente necesario para git, pero el soporte para eso es limitado y no se usa comúnmente). Los repositorios de compilación simples generalmente son solo una rama superpuesta en la que fusiona / exporta el árbol de compilación. Algunas personas combinan recursos de ejercicio en su árbol de origen o separan árboles adicionales, externos, de construcción y de origen. Por lo general, tiene dos propósitos: el almacenamiento en caché de compilación y las compilaciones repetibles, pero a veces mantenerlo separado al menos en cierto nivel también permite compilaciones nuevas / en blanco y compilaciones múltiples fácilmente.
Hay una serie de estrategias para esto y ninguna de ellas funciona especialmente bien con la persistencia de la lista de fuentes a menos que mantenga una fuente externa en su árbol de fuentes.
También tienen cosas como hashes en el archivo, ¿cómo se fusionan cuando dos personas actualizan paquetes? Eso solo debería hacerte pensar que tal vez esto está mal interpretado.
Los argumentos que las personas exponen para los archivos de bloqueo son casos en los que han tomado una visión muy específica y restrictiva del problema. ¿Quieres compilaciones repetibles y compilaciones consistentes? Incluya la carpeta del proveedor en VCS. Luego, también acelera la recuperación de activos y no tiene que depender de recursos externos potencialmente rotos durante la compilación. Ninguna de las tuberías de compilación e implementación que creo requieren acceso externo a menos que sea absolutamente necesario. Si tiene que actualizar un recurso externo, es una vez y solo una vez. Lo que el compositor está tratando de lograr tiene sentido para un sistema distribuido, excepto como se mencionó antes, ya que no tiene sentido porque terminaría con un infierno de dependencia de la biblioteca para las actualizaciones de la biblioteca con choques comunes y actualizaciones tan lentas como el paquete de actualización más lento.
Además actualizo ferozmente. Cada vez que desarrollo, actualizo y pruebo todo. Hay una ventana muy muy pequeña para que la versión significativa se filtre. También de manera realista, cuando se mantiene el control de versiones semántico, que tiende a ser para el compositor, no se supone que tenga tantos problemas de compatibilidad o roturas.
En composer.json pones los paquetes que necesitas y sus versiones. Puede bloquear las versiones allí. Sin embargo, esos paquetes también tienen dependencias con versiones dinámicas que no serán bloqueadas por composer.json (aunque no veo por qué no podría ponerlas allí usted mismo si desea que se bloqueen las versiones) para que alguien más ejecute la instalación de Composer obtiene algo diferente sin la cerradura. Es posible que no le importe mucho eso o que le importe, depende. ¿Te debería importar? Probablemente al menos un poco, lo suficiente como para asegurarse de estar al tanto en cualquier situación e impacto potencial, pero puede que tampoco sea un problema si siempre tiene el tiempo para ejecutar DRY primero y arreglar cualquier cosa que se haya actualizado.
El compositor de problemas está tratando de evitar a veces simplemente no está allí y la molestia de tener archivos de bloqueo de compositor puede ser importante. No tienen absolutamente ningún derecho a decirles a los usuarios qué deben o no deben hacer con respecto a los activos de compilación versus fuente (ya sea que se unan o se separen en VCS), ya que eso no es asunto suyo, no son su jefe ni el mío. "Composer dice" no es una autoridad, no son su oficial superior ni le dan a nadie superioridad sobre este tema. Solo usted conoce su situación real y qué es lo mejor para eso. Sin embargo, podrían recomendar un curso de acción predeterminado para los usuarios que no entienden cómo funcionan las cosas, en cuyo caso es posible que desee seguir eso, pero personalmente no creo que ' es un verdadero sustituto para saber cómo funcionan las cosas y poder entrenar adecuadamente sus requisitos. En última instancia, su respuesta a esa pregunta es una mejor suposición. Las personas que hacen compositor no saben dónde debe guardar su compositor. Ni tampoco ellos. Su única responsabilidad es decirle qué es y qué hace. Fuera de eso, debes decidir qué es lo mejor para ti.
Mantener el archivo de bloqueo es problemático para la usabilidad porque el compositor es muy reservado sobre si usa bloqueo o JSON y no siempre es bueno usar ambos juntos. Si ejecuta install, solo usa el archivo de bloqueo, aparecerá así que si agrega algo a composer.json, entonces no se instalará porque no está en su bloqueo. No es intuitivo en absoluto lo que las operaciones realmente hacen y lo que están haciendo con respecto al archivo json / lock y, a veces, parece no tener sentido (la ayuda dice que la instalación toma un nombre de paquete, pero al intentar usarlo dice que no )
Para actualizar el bloqueo o básicamente aplicar cambios desde el json, debe usar la actualización y es posible que no desee actualizar todo. El bloqueo tiene prioridad para elegir lo que se debe instalar. Si hay un archivo de bloqueo, es lo que se usa. Puede restringir un poco la actualización, pero el sistema sigue siendo un desastre.
La actualización lleva una edad, conciertos de RAM. Sospecho también que si escoges un proyecto que no ha sido tocado por un tiempo y que parecía de las versiones que tenía, que habrá más con el tiempo y probablemente no lo haga de manera eficiente, lo que simplemente lo estrangula.
Son muy muy astutos cuando se trata de tener comandos compuestos secretos que no podrías esperar que sean compuestos. De forma predeterminada, el comando de eliminación de compositor aparece en los mapas para la actualización de compositor y la eliminación de compositor, por ejemplo.
La pregunta que realmente debe hacerse no es si debe mantener el bloqueo en su árbol de origen o, alternativamente, si debe persistir en algún lugar de alguna manera o no, sino que debe preguntarse qué hace realmente, luego puede decidir por sí mismo cuando necesitas persistir y dónde.
Señalaré que tener la capacidad de tener el bloqueo es una gran conveniencia cuando tienes una estrategia sólida de persistencia de dependencia externa, ya que te rastrea la información útil para rastrear eso (los orígenes) y actualizarlo, pero si no lo haces entonces no está ni aquí ni allá. No es útil cuando se te obliga a bajar por la garganta como una opción obligatoria para que contamine tus árboles de origen. Es algo muy común encontrar en las bases de códigos heredadas donde las personas han realizado muchos cambios en composer.json que realmente no se han aplicado y se rompen cuando las personas intentan usar composer. Sin composer.lock, sin problema de desincronización.