В во времена Symfony 2.0.x, когда Composer’а еще не существовало, обновить проект с предыдущей минорной версии Symfony к последующему было не всегда просто. Вы должны были объединить изменения, которые были сделаны, в DEPS и deps.lock файлы. Нужно было учесть как изменения ядра Symfony, так и основных бандлов фреймворка, которые включены в поставку Standard Edition. И, конечно, если у вас были другие сторонние зависимости, нужно было обновить их самостоятельно (найти правильный вариант обновления для каждого из них). В принципе все это было вполне выполнимо, хоть и превращалось иногда в кошмар, особенно когда возникали ситуации с конфликтующими зависимостями.
Начало работы с Composer’ом
Composer используется Symfony, начиная с версии 2.1, но, поскольку тогда это было самой первой адаптацией, и, в связи с тем что композитор и экосистема Symfony не были стабильными, работать было все еще неудобно. Рекомендованный минимальный статус стабильности пакетов был Dev, и поэтому, всякий раз, когда мы запускали composer update, мы могли получить проблемы с зависимостями. Как вариант, чтобы уменьшить возможные негативные последствия, мы формировали файл composer.lock для Standard Edition … что позволяло, в итоге, успешно обновить наш проект. Но опять же, если у вас есть другие зависимости, объединение с их с заблокироваными зависимостями вызывало постоянную головную боль. Мы просто использовали Composer, как старые DEPS файлы, ну если не учитывать того, что композитор позволяет дать хоть какую то гарантию, что все версии зависимостей будут работать вместе.
Перенесемся к релизу Symfony 2.3.
По состоянию на Symfony 2.3, минимальный уровень стабильности был поднят на stable. Это стало возможно, потому что экосистема Symfony в целом была гораздо более зрелой и потому, что почти все хорошие / полезные / поддержанные / популярные бандлы имели стабильные релизы с хорошим описанием своих зависимостей.
Если Вы знаете о хорошем бандле или библиотеке PHP, которые все еще имеют минимальную стабильность Dev, поговорить с разработчиком и убедить его заменить стабильность пакета на stable. Потому что мы, в настоящее время, используем stable версии всех зависимостей по умолчанию.
Итак, как же теперь выглядит стандартная последовательность действий по обновлению Symfony 2.3 проектов? Все до смешного просто, настолько просто, что некоторые разработчики будут в замешательстве. Позвольте мне продемонстрировать, рабочий процесс обновления для Symfony 2.3+ выглядит примерно так:
$ composer update
Вот и все, что нужно сделать. Нет необходимости делать что-нибудь еще. И, было бы неплохо, если ваш проект будет содержать файл composer.lock, чтобы все разработчики, работающие с вами над проектом могли установлены те же версии зависимостей.
Обратите внимание, нет ничего что бы указывало на связь с Symfony. Обновление с предыдущей минорной версии Symfony к последующей ничем не отличается от обновления любых других зависимостей.
Вам не нужно отслеживать изменения или обновления. И по той причине, что релиз Symfony 2.3 является релизом долгосрочной поддержкой с жестким принципом «Не ломайте обратную совместимость», вы можете запускать composer update с уверенностью. Можно считать, что Symfony это просто еще одна зависимость вашего проекта, как и множество других.
Вот краткое объяснение, и, в принципе, можно остановиться на этом. Но если вы хотите узнать больше, читайте дальше, я покажу вам как это работает на практике.
Давайте предположим, что вы создали новый Symfony 2.3.0 проект на прошлой неделе с помощью следующей команды:
$ composer create-project -n symfony/framework-standard-edition path/ 2.3.0
При выполнении этой команды, composer создал новый каталог, куда он загрузил версию Symfony Standard Edition 2.3.0. Затем он установил все зависимости указанные в файле composer.json:
Installing symfony/framework-standard-edition (v2.3.0) - Installing symfony/framework-standard-edition (v2.3.0) Loading from cache Created project in path/Loading composer repositories with package informationInstalling dependencies (including require-dev) - Installing jdorn/sql-formatter (v1.2.9) Loading from cache - Installing doctrine/lexer (v1.0) Loading from cache - Installing doctrine/annotations (v1.1.1) Loading from cache - Installing doctrine/collections (v1.1) Loading from cache - Installing doctrine/cache (v1.0) Loading from cache - Installing doctrine/inflector (v1.0) Loading from cache - Installing doctrine/common (2.4.0-RC3) Loading from cache - Installing doctrine/dbal (2.3.4) Loading from cache - Installing psr/log (1.0.0) Loading from cache - Installing twig/twig (v1.13.1) Loading from cache - Installing symfony/icu (v1.2.0) Loading from cache - Installing symfony/symfony (v2.3.0) Loading from cache - Installing doctrine/doctrine-bundle (v1.2.0) Loading from cache - Installing twig/extensions (v1.0.0) Loading from cache - Installing kriswallsmith/assetic (v1.1.1) Loading from cache - Installing symfony/assetic-bundle (v2.3.0) Loading from cache - Installing swiftmailer/swiftmailer (v5.0.0) Loading from cache - Installing symfony/swiftmailer-bundle (v2.3.0) Loading from cache - Installing monolog/monolog (1.5.0) Loading from cache - Installing symfony/monolog-bundle (v2.3.0) Loading from cache - Installing sensio/distribution-bundle (v2.3.0) Loading from cache - Installing sensio/framework-extra-bundle (v2.3.0) Loading from cache - Installing sensio/generator-bundle (v2.3.0) Loading from cache - Installing incenteev/composer-parameter-handler (v2.0.0) Loading from cache - Installing doctrine/orm (2.3.4) Loading from cache Skipped installation of bin/doctrine for package doctrine/orm: name conflicts with an existing file Skipped installation of bin/doctrine.php for package doctrine/orm: name conflicts with an existing file kriswallsmith/assetic suggests installing leafo/lessphp (Assetic provides the integration with the lessphp LESS compiler) kriswallsmith/assetic suggests installing leafo/scssphp (Assetic provides the integration with the scssphp SCSS compiler) kriswallsmith/assetic suggests installing ptachoire/cssembed (Assetic provides the integration with phpcssembed to embed data uris) kriswallsmith/assetic suggests installing leafo/scssphp-compass (Assetic provides the integration with the SCSS compass plugin) monolog/monolog suggests installing mlehner/gelf-php (Allow sending log messages to a GrayLog2 server) monolog/monolog suggests installing raven/raven (Allow sending log messages to a Sentry server) monolog/monolog suggests installing doctrine/couchdb (Allow sending log messages to a CouchDB server) monolog/monolog suggests installing ext-amqp (Allow sending log messages to an AMQP server (1.0+ required)) monolog/monolog suggests installing ext-mongo (Allow sending log messages to a MongoDB server) Writing lock fileGenerating autoload filesCreating the "app/config/parameters.yml" file. Clearing the cache for the dev environment with debug true Installing assets using the hard copy option Installing assets for Symfony\Bundle\FrameworkBundle into web/bundles/framework Installing assets for Acme\DemoBundle into web/bundles/acmedemo Installing assets for Sensio\Bundle\DistributionBundle into web/bundles/sensiodistribution
Как вы можете видеть, Композитор установил Symfony версию 2.3.0, а также те версии бандлов, которые указанны в файле composer.json.
Теперь, чтобы перейти на Symfony 2.3.1, вы можете выполнить следующую команду:
$ composer update symfony/symfony
И, в результате, получите что-то вроде этого:
Loading composer repositories with package informationUpdating dependencies (including require-dev) - Removing symfony/symfony (v2.3.0) - Installing symfony/symfony (v2.3.1) Loading from cache Writing lock fileGenerating autoload filesUpdating the "app/config/parameters.yml" file. Clearing the cache for the dev environment with debug true Installing assets using the hard copy option Installing assets for Symfony\Bundle\FrameworkBundle into web/bundles/framework Installing assets for Acme\DemoBundle into web/bundles/acmedemo Installing assets for Sensio\Bundle\DistributionBundle into web/bundles/sensiodistribution
Как вы можете видеть, Composer обновил только пакет symfony/symfony. Все потому, что бандлы Symfony настроены как совместимые с любой версией Symfony 2.3, поэтому их обновления на 2.3.1 не потребовалось.
Но если бы я выполнить команду обновления без аргументов:
$ composer update
Композитор бы обновили все зависимости до последних стабильных версий:
Loading composer repositories with package informationUpdating dependencies (including require-dev) - Removing symfony/symfony (v2.3.0) - Installing symfony/symfony (v2.3.1) Loading from cache - Removing symfony/swiftmailer-bundle (v2.3.0) - Installing symfony/swiftmailer-bundle (v2.3.1) Loading from cache - Removing sensio/distribution-bundle (v2.3.0) - Installing sensio/distribution-bundle (v2.3.1) Loading from cache - Removing sensio/framework-extra-bundle (v2.3.0) - Installing sensio/framework-extra-bundle (v2.3.1) Loading from cache - Removing sensio/generator-bundle (v2.3.0) - Installing sensio/generator-bundle (v2.3.1) Loading from cache Writing lock fileGenerating autoload filesUpdating the "app/config/parameters.yml" file. Clearing the cache for the dev environment with debug true Installing assets using the hard copy option Installing assets for Symfony\Bundle\FrameworkBundle into web/bundles/framework Installing assets for Acme\DemoBundle into web/bundles/acmedemo Installing assets for Sensio\Bundle\DistributionBundle into web/bundles/sensiodistribution
В качестве заключения:
На самом деле, я немного лукавил, когда писал эту статью. Когда вы просите Composer установить Symfony Standard Edition в версии 2.3.0, он загружает пакет и запускает composer install. Но он установит Symfony версию 2.3.1 вместо 2.3.0, почему так происходит? Во-первых, даже если версии совпадают, нет никакой связи между версиями Symfony 2.3.0 и Symfony 2.3.0 Standard Edition. Просто так получилось, что мы синхронизировали наши релизы для простоты (это то, что мы можем прекратить делать в любой момент). Тогда, так как Standard Edition не упоминается в файле composer.lock, и потому что я выполнилял эту команду после того как Symfony 2.3.1 был зарелизен, и поскольку требования в файле composer.json указывают что нужна версия 2,3. *, Composer в результате установил Symfony версию 2.3.1, которая и была последней стабильной версией, что соответствует требованиям в файле composer.json.
Так, при добавлении зависимости к проекту (будь то Symfony, компонент Symfony, бандл Symfony, или любой другой библиотеки PHP если уж на то пошло), у вас есть несколько вариантов:
- Оставить одну конкретную версию: «symfony/symfony»: «2.3.0»;
- Оставить диапазон версий: «symfony/symfony»: «>=2.3.0,<2.4-dev»;
- Использовать любые будущие стабильные версии: «symfony/symfony»: «~2.3».
Последний вариант рекомендуется только если зависимость имеет должным образом семантическую схемы управления версиями и если вы доверяете политику обновления разработчик (никогда не ломаются обратную совместимость в незначительной версии).