Me preocupa el despliegue contínuo, fijando versiones en composer.json (editado)

¿Qué pasa si tienes un proyecto con librerías gestionadas con #Composer y le has puesto muchas de ellas que se actualicen a la última versión disponible?
Para mantener el programa actualizado, beneficiándote de las últimas mejoras de cada librería, era una buena solución. Poner todo a la versión ‘dev-master’. Jeje, todo va bien mientras estás desarrollando..

De vez en cuando alguna función ‘deprecated’ deja de existir porque definitivamente la eliminaron. Nuevas funciones o propiedades que podemos usar. La aplicación funciona cada vez mejor pero sabes que no hay otra que fijar las versiones si no cuando pasemos a producción es un riesgo que se actualice automáticamente y zas! dejó de funcionar. Así que hay que buscar la versión que tenemos instalada de cada paquete y fijarlas.


Puede que tengamos un composer.json parecido a éste, con muchos ~ * @dev dev-master >= etcétera:

"requiere" : { "php" : ">=5.3.3", "symfony/symfony" : "2.5.*", "doctrine/orm" : "~2.2,>=2.2.3", "doctrine/doctrine-bundle" : "~1.2", "twig/extensions" : "~1.0", "symfony/assetic-bundle" : "~2.3", "symfony/swiftmailer-bundle" : "~2.3", "symfony/monolog-bundle" : "~2.4", "sensio/distribution-bundle" : "~3.0", "sensio/framework-extra-bundle" : "~3.0", "incenteev/composer-parameter-handler" : "~2.0", "sensio/generator-bundle" : "~2.3", "mopa/bootstrap-bundle" : "dev-master", "twbs/bootstrap" : "dev-master", "knplabs/knp-paginator-bundle" : "dev-master", "knplabs/knp-menu-bundle" : "dev-master", "knplabs/knp-menu" : "2.0.*@dev", "craue/formflow-bundle" : "dev-master", "friendsofsymfony/user-bundle" : "~2.0@dev", "doctrine/doctrine-fixtures-bundle" : "dev-master", "doctrine/data-fixtures" : "dev-master", "liip/functional-test-bundle" : "dev-master", "liuggio/excelbundle" : "dev-master", "phpunit/phpunit" : "4.2.*", "symfony/framework-bundle" : ">=2.0.0", "aws/aws-sdk-php" : ">=2.6.2" },

Por ejemplo, la primera línea sobre el requerimiento de php no depende de nosotros sino de la versión instalada en el servidor. Así que vamos a la segunda, la de symfony/symfony.

Ahora mismo el proyecto funciona, así que ejecutamos lo siguiente en un terminal o línea de comandos:

$ composer show -i

Si no lo tenemos instalado globalmente entonces:

$ php composer.phar show -i

En éste caso me puede haber salido algo como lo siguiente:

aws/aws-sdk-php 2.7.2 AWS SDK for PHP - Use Amazon Web Services in your PHP project craue/formflow-bundle dev-master a88ecba Multi-step forms for your Symfony2 project. doctrine/annotations v1.2.1 Docblock Annotations Parser doctrine/cache v1.3.1 Caching library offering an object-oriented API for many cache backends doctrine/collections v1.2 Collections Abstraction library doctrine/common v2.4.2 Common Library for Doctrine projects doctrine/data-fixtures dev-master ac36ccc Data Fixtures for all Doctrine Object Managers doctrine/dbal v2.4.3 Database Abstraction Layer doctrine/doctrine-bundle v1.2.0 Symfony DoctrineBundle doctrine/doctrine-fixtures-bundle dev-master 9a5b528 Symfony DoctrineFixturesBundle doctrine/inflector v1.0 Common String Manipulations with regard to casing and singular/plural rules. doctrine/instantiator 1.0.4 A small, lightweight utility to instantiate objects in PHP without invoking their constructors doctrine/lexer v1.0 Base library for a lexer that can be used in Top-Down, Recursive Descent Parsers. doctrine/orm v2.4.6 Object-Relational-Mapper for PHP friendsofsymfony/user-bundle dev-master 9714a92 Symfony FOSUserBundle guzzle/guzzle v3.9.2 Guzzle is a PHP HTTP client library and framework for building RESTful web service clients incenteev/composer-parameter-handler v2.1.0 Composer script handling your ignored parameter file jdorn/sql-formatter v1.2.17 a PHP SQL highlighting library knplabs/knp-components 1.3.1 Knplabs component library knplabs/knp-menu dev-master d6f3cc4 An object oriented menu library knplabs/knp-menu-bundle dev-master bdfc95d This bundle provides an integration of the KnpMenu library knplabs/knp-paginator-bundle dev-master 701dffe Paginator bundle for Symfony2 to automate pagination and simplify sorting and other features kriswallsmith/assetic v1.2.0 Asset Management for PHP liip/functional-test-bundle dev-master eb42b04 This bundles provides additional functional test-cases for Symfony2 applications liuggio/ExcelBundle dev-master 22a2a74 This is a Symfony2 Bundle helps you to read and write Excel files (including pdf, xlsx, odt), thanks to the PHPExcel library monolog/monolog 1.11.0 Sends your logs to files, sockets, inboxes, databases and various web services mopa/bootstrap-bundle dev-master a0ee4e8 Easy integration of twitters bootstrap into symfony2 mopa/composer-bridge v1.3.0 Symfony2 Composer Bridge phpoffice/phpexcel 1.8.0 PHPExcel - OpenXML - Read, Create and Write Spreadsheet documents in PHP - Spreadsheet engine phpunit/php-code-coverage 2.0.11 Library that provides collection, processing, and rendering functionality for PHP code coverage information. phpunit/php-file-iterator 1.3.4 FilterIterator implementation that filters files based on a list of suffixes. phpunit/php-text-template 1.2.0 Simple template engine. phpunit/php-timer 1.0.5 Utility class for timing phpunit/php-token-stream 1.3.0 Wrapper around PHP's tokenizer extension. phpunit/phpunit 4.2.6 The PHP Unit Testing framework. phpunit/phpunit-mock-objects 2.3.0 Mock Object library for PHPUnit psr/log 1.0.0 Common interface for logging libraries sebastian/comparator 1.0.1 Provides the functionality to compare PHP values for equality sebastian/diff 1.2.0 Diff implementation sebastian/environment 1.2.0 Provides functionality to handle HHVM/PHP environments sebastian/exporter 1.0.2 Provides the functionality to export PHP variables for visualization sebastian/version 1.0.3 Library that helps with managing the version number of Git-hosted PHP projects sensio/distribution-bundle v3.0.8 Base bundle for Symfony Distributions sensio/framework-extra-bundle v3.0.2 This bundle provides a way to configure your controllers with annotations sensio/generator-bundle v2.4.0 This bundle generates code for you sensiolabs/security-checker v2.0.0 A security checker for your composer.lock swiftmailer/swiftmailer v5.3.0 Swiftmailer, free feature-rich PHP mailer symfony/assetic-bundle v2.5.0 Integrates Assetic into Symfony2 symfony/monolog-bundle v2.6.1 Symfony MonologBundle symfony/swiftmailer-bundle v2.3.7 Symfony SwiftmailerBundle symfony/symfony v2.5.6 The Symfony PHP framework twbs/bootstrap dev-master e27dc5d The most popular front-end framework for developing responsive, mobile first projects on the web. twig/extensions v1.2.0 Common additional features for Twig that do not directly belong in core twig/twig v1.16.2 Twig, the flexible, fast, and secure template language for PHP

Viendo la línea de symfony/symfony vemos que tenemos instalada la versión 2.5.6. Entonces podemos ir a nuestro fichero composer.json y cambiar el 2.5.* por 2.5.6 así siempre sabremos que no se actualizará a la versión 2.5.7 y sucesivas. Evitando así esos posibles fallos.

Así sucesivamente.

Hay versiones que siguen estando a dev-master al ejecutar ‘composer show -i’. No queda otra que ir viendo uno a uno en sus webs, a ver cuál es la última versión disponible e ir probando si al fijarla continúa funcionando nuestro proyecto.

Usando composer install en vez de update

Otra opción que tenemos es usar ‘composer install’. Lo que hacemos haciendo ‘install’ en vez de ‘update’ es usar la versión exacta que tengamos en el fichero composer.lock es en vez de comprobar las versiones disponibles, descargar las últimas permitidas y así arriesgarnos a que luego deje de funcionar.

Hay que ir viendo un término intermedio entre fijar las librerías a una cierta versión con lo que te quedas sin las últimas mejoras pero ganas estabilidad, o pones las librerías a dev-master con lo que te puedes pasar mucho tiempo “acomodando” las nuevas funcionalidades de cada librería a la aplicación pero ganarás que tu aplicación tendrá todo lo nuevo.

Resumiendo, en local deberíamos siempre de ir actualizando las librerías. Usando ‘composer update’ de vez en cuando para mantener nuestro programa actualizado. Comprobamos que todo funcione y cuando estamos seguros subimos el fichero composer.lock al repositorio para hacer ‘composer install’ en el despliegue.

Además, si ejecutamos en el despliegue:

$ composer install –prefer-dist

sólo te descargará lo necesario para que tu aplicación funcione con lo que descargará bastante menos y la aplicación será más ligera.

Espero que sirva.

Un saludo 🙂

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *