¿Es mala práctica commitear el composer.lock?

Acabas de montar tu proyecto.

Es hora de instalar alguna que otra librería. Sin dudarlo un segundo arranca la seguidilla de composer require.

Escribes algo de código, realizas tus pruebas, todo listo para hacer un commit.

git add .

git commit -m "Initial commit"

Y de pronto… algo llama tu atención.

¿Por qué se están agregando dos archivos de composer?

Más específicamente, ¿por qué el composer.json y el composer.lock?

¿Acaso el .lock no se genera automáticamente al ejecutar composer install?

Es más, dando una rápida mirada se ve que el .lock pesa mucho más (¡muchísimo más!) que el .json:

¿Es realmente necesario engordar el repo con este archivo?

Respuesta corta: sí.

¿Querés saber por qué?

Te lo explico a continuación.

composer.json vs. composer.lock

Ambos archivos tienen formato json, así que, por este lado no pasa el tema.

¿Qué tiene composer.lock que no tenga composer.json?

Si abrís ambos archivos notarás que son parecidos, pero no iguales.

En principio, en el composer.json se almacenan los patrones de dependencias, mientras que en el composer.lock se almacenan las dependencias con sus versiones exactas (Más las dependencias de esas dependencias y otro montón de información).

Un ejemplo:

Donde composer.json dice:

"doctrine/common": "^3.4"

En composer.lock encontrarás:

{
            "name": "doctrine/common",
            "version": "3.4.3",
            "source": {
                "type": "git",
                "url": "https://github.com/doctrine/common.git",
                "reference": "8b5e5650391f851ed58910b3e3d48a71062eeced"
            },
            "dist": {
                "type": "zip",
                "url": "https://api.github.com/repos/doctrine/common/zipball/8b5e5650391f851ed58910b3e3d48a71062eeced",
                "reference": "8b5e5650391f851ed58910b3e3d48a71062eeced",
                "shasum": ""
            },
            "require": {
                "doctrine/persistence": "^2.0 || ^3.0",
                "php": "^7.1 || ^8.0"
            },
            "require-dev": {
                "doctrine/coding-standard": "^9.0 || ^10.0",
                "doctrine/collections": "^1",
                "phpstan/phpstan": "^1.4.1",
                "phpstan/phpstan-phpunit": "^1",
                "phpunit/phpunit": "^7.5.20 || ^8.5 || ^9.0",
                "squizlabs/php_codesniffer": "^3.0",
                "symfony/phpunit-bridge": "^6.1",
                "vimeo/psalm": "^4.4"
            },
            "type": "library",
            "autoload": {
                "psr-4": {
                    "Doctrine\\Common\\": "src"
                }
            },
            "notification-url": "https://packagist.org/downloads/",
            "license": [
                "MIT"
            ],
            "authors": [
                {
                    "name": "Guilherme Blanco",
                    "email": "guilhermeblanco@gmail.com"
                },
                {
                    "name": "Roman Borschel",
                    "email": "roman@code-factory.org"
                },
                {
                    "name": "Benjamin Eberlei",
                    "email": "kontakt@beberlei.de"
                },
                {
                    "name": "Jonathan Wage",
                    "email": "jonwage@gmail.com"
                },
                {
                    "name": "Johannes Schmitt",
                    "email": "schmittjoh@gmail.com"
                },
                {
                    "name": "Marco Pivetta",
                    "email": "ocramius@gmail.com"
                }
            ],
            "description": "PHP Doctrine Common project is a library that provides additional functionality that other Doctrine projects depend on such as better reflection support, proxies and much more.",
            "homepage": "https://www.doctrine-project.org/projects/common.html",
            "keywords": [
                "common",
                "doctrine",
                "php"
            ],
            "support": {
                "issues": "https://github.com/doctrine/common/issues",
                "source": "https://github.com/doctrine/common/tree/3.4.3"
            },
            "funding": [
                {
                    "url": "https://www.doctrine-project.org/sponsorship.html",
                    "type": "custom"
                },
                {
                    "url": "https://www.patreon.com/phpdoctrine",
                    "type": "patreon"
                },
                {
                    "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fcommon",
                    "type": "tidelift"
                }
            ],
            "time": "2022-10-09T11:47:59+00:00"
        },

En otras palabras, en el archivo composer.json se almacena la mínima información necesaria para generar el composer.lock

Ya sé, ya sé, todavía no respondí a la pregunta: si puedo generar el composer.lock a partir del composer.json… ¿para qué quiero comitear el primero?

La respuesta radica en el hecho de que un patrón de dependencias puede resolverse con muchas opciones diferentes.

Por ejemplo,

"doctrine/common": "^3.4"

Podría satisfacerse con doctrine/common en sus versiones :

  • 3.4.0
  • 3.4.1
  • 3.4.2
  • 3.4.3
  • 3.4.4
  • 3.4.5

Aunque no sería compatible con 3.3.* ni con 3.5.*.

El sistema de restricciones de versiones tiene sus vueltas pero si querés aprender más podés consultarlo directamente acá.

Y todo esto es importante porque…?

Porque, si hiciste tus pruebas con la versión x.y.z de una librería y luego, al momento de instalar la aplicación, sin que te des cuenta instalás la versión x.y.z+1 es posible que te encuentres con ese tipo de sorpresitas que a nadie le gustan.

De hecho, una de las razones más importantes que dieron origen a Composer es precisamente esta, asegurarte de que las versiones de las dependencias estén sincronizadas entre entornos.

Por eso el archivo se llama .lock, porque las dependencias están cerradas.

Así que, si pensabas ahorrarte algunos bytes en el repo… me temo que no estás de suerte en esta ocasión.

mchojrin

Por mchojrin

Ayudo a desarrolladores PHP a afinar sus habilidades técnicas y avanzar en sus carreras

¿Te quedó alguna duda? Publica aca tu pregunta

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.