Uno de los problemas a los que nos enfrentamos cada vez que estamos desarrollando un proyecto es a las dependencias con el framework, librerías y demás. Composer es un gestor de dependencias que nos ayuda a manejar todas las librerías externas, sus actualizaciones, el autoloading. En resumen, con Composer nuestra vida es más sencilla, pero como se utiliza, ¿Cómo sacarle partido a Composer?


Configurando Composer

Para manejar las dependencias tenemos que utilizar un archivo llamado composer.json en el cual escribimos que librerías necesitamos, definimos el autoloading.

{
  "name": "jeslopcru/simply-slug",
  "description": "Simple implementation for convert a string into a slug",
  "minimum-stability": "dev",
  "license": "MIT",
  "authors": [
    {
      "name": "Jesús López",
      "homepage": "http://jesuslc.com"
    }
  ],
  "require": {
    "php": ">=5.3.3"
  },
  "require-dev": {
    "phpunit/phpunit": "~4.0",
    "fabpot/php-cs-fixer": "~2.0@dev"
  },
  "autoload": {
    "psr-4": {"jeslopcru\\SimplySlug\\": "src/"}
  },
  "autoload-dev": {
    "psr-4": {
      "jeslopcru\\SimplySlug\\Test\\": "tests"
    }
  },
  "extra": {
    "branch-alias": {
      "dev-master": "1.0-dev"
    }
  }
}

No debemos preocuparnos por el esquema ya que podemos generarlos interectivamente utilizando

$ composer init

De la misma manera la documentación de Composer es genial y siempre podemos validar utilizando

$ composer validate

Explicando composer.json

  • Los atributos name, description, type, author… sirven para que otros usuarios puedan encontrar la librería en packlist
  • require define las dependencias que necesitamos para que nuestra librería pueda utilizarse, desde la minima versión de PHP hasta librerías de 3º
  • require-dev son los paquetes y librerías necesarias para desarrollar, pero que no necesitan utilizarse en producción, (PHPUnit por ejemplo)
  • autoload define como se deben cargar las clases

Manos a la obra

Para empezar a utilizar composer solo tenemos que crear el fichero composer.json y ejecutar el comando

$ composer install

Con esto descargamos todas las librerías necesarias en la carpeta vendor y se creará un archivo vendor/autoload.php el que podremos utilizar para el autoload. Tambien se creará un archivo composer.loc que necesita composer para gestionar las versiones de las dependencias.

De la misma manera, si es necesario se creará una carpeta llamada vendor/bin donde están los ejecutables de las librerías de 3º, por ejemplo si utilizamos phpunit tendremos ahí el ejecutable.

¿Cómo utilizar repositorios privados?

Por defecto composer utiliza packalist, pero si el código que tenemos que utilizar está en un repositorio privado ¿que hacemos? Para ello solo tenemos que añadir el siguiente bloque al fichero composer.json, validarlo ($ composer validate) y actualizarlo ($ composer update)

    "require": {
        "vendor/my-private-repo": "dev-master"
    },
    "repositories": [
        {
            "type": "vcs",
            "url":  "git@bitbucket.org:vendor/my-private-repo.git"
        }
    ]

Composer buscará las dependencias en estos repositorios y como ultimo recurso utilizará Packlist. La documentación de esta parte es muy detallada y con muchas opciones, así que te recomiendo que le eches un vistazo.

Eventos con Composer

En el flujo de descarga e instalación de dependencias podemos definir una serie de triggers para algunos eventos. Por ejemplo que después de instalar los paquetes se ejecute phpunit o lo que nosotros queramos. Para ello tan solo tenemos que definir los eventos que necesitemos en el fichero composer.json

    "scripts": {
        "post-update-cmd": "MyVendor\\MyClass::postUpdate",
        "post-package-install": [
            "MyVendor\\MyClass::postPackageInstall"
        ],
        "post-install-cmd": [
            "MyVendor\\MyClass::warmCache",
            "phpunit -c app/"
        ],
        "post-create-project-cmd" : [
            "php -r \"copy('config/local-example.php', 'config/local.php');\""
        ]
    }

Aquí podemos encontrar la documentación. Además utilizando esto podemos ejecutar e instalar otros paquetes JS como npm o bower.

Trabajando con entornos de producción

Ya hemos visto que composer es una herramienta necesaria para desarrollar y gestionar nuestras dependencias, pero no es lo mismo estar en un entorno de desarrollo que en uno de producción, en desarrollo necesitamos phpunit, phpcs, que las nuevas clases carguen automáticamente, pero ninguna de estás cosas es necesaria en producción.

Para generar un proyecto de producción debemos ejecutar este comando:

$ composer install --no-dev --optimize-autoloader --prefer-dist --no-interaction

Así nos aseguramos de no cargar librerías , tendremos un autoload específico que solo actualiza las clases que necesitamos (–optimize-autoload) y además si hubiese un conflicto indicamos a composer que el lo resuelva, así nos será más facil desplegar en producción, ayq que no necesitaremos intervención manual.

Referencias

3 respuestas a “Cómo sacarle partido a Composer”

  1. Avatar de ¿Cómo crear un paquete/librería en PHP siguiendo PSR-4? – Jesús L.C.

    […] Composer es una herramienta que nos permite gestionar paquetes y dependencias dentro de de nuestro proyecto. Anteriormente ya hemos hablado de Composer en como sacarle partido a composer. […]

    Me gusta

  2. Avatar de Dejar de ser un cowboy del código y aplicar buenas prácticas de desarrollo a WordPress – Jesús L.C.

    […] hemos hablado de como sacarle partido a composer, así que vamos a ello. Hace un tiempo encontré esta charla de Asier Marques en Desymfony […]

    Me gusta

  3. Avatar de consejos y trucos de composer PHP – Jesús L.C.

    […] de dependencias y paquetes en PHP, si quieres empezar, hace ya bastante tiempo que hablé de como sacarle partido a composer y de cómo hacer una libreria utilizando composer. Hoy voy a dar una lista de consejos y […]

    Me gusta

Replica a ¿Cómo crear un paquete/librería en PHP siguiendo PSR-4? – Jesús L.C. Cancelar la respuesta

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

Jesús López

Soy un Ingeniero en Informática y apasionado de la programación. Me gusta disfrutar de mi familia, viajar y perdernos paseando.  Me mola programar, hacer tests y refactorizar código . Practico Test Driven Development (TDD) y me lo paso bien con el legacy codeLeer más

Sígueme en: