для чего нужен composer lock
Не игнорьте composer.lock
install vs update
Какой же этот Composer долгий… И памяти жрёт при обновлении…
Через какое-то время после очередного деплоймента продакшн снова фатально падает. Какого.
Composer — одна из причин, по которой PHP сегодня именно такой. Популярный, прогрессивный и удобный. Именно поэтому мы в RUVENTS считаем понимание принципов работы менеджера зависимостей одним из ключевых навыков PHP-программиста.
Фиксация зависимостей
При работе с зависимостями нам хотелось бы достичь следующих результатов:
Для достижения этих целей необходим механизм, который в момент фиксации изменений будет запоминать состояние зависимостей как часть состояния проекта. Назовем это фиксацией зависимостей.
Самая простая реализация такого механизма — lock-файл с информацией об установленных зависимостях. Файл должен храниться в репозитории и позволять однозначно воспроизводить на любой другой площадке набор пакетов, использованных программистом при разработке.
А что там у Composer
В Composer lock-файл называется composer.lock и располагается в корне проекта. Чтобы понять, как он генерируется и используется, разберем механизм работы двух команд менеджера.
composer update
Для каждого заявленного в проекте пакета менеджер находит его источник, считывает информацию о версиях и зависимостях, а затем рекурсивно повторяет то же самое для зависимостей пакета, чтобы получить полное дерево. После этого Composer разрешает зависимости с учетом версионных правил, объявленных во всех собранных composer.json файлах.
Информация о пакете, рекомендованном к установке, имеет следующий вид:
Плоский массив таких объектов будет записан в формате JSON в злополучный файл composer.lock по завершении команды. Это и есть фиксация зависимостей в Composer.
После всех этих ресурсоёмких операций менеджер сопоставляет разрешенные зависимости с уже имеющимися пакетами в папке vendor/ и устраняет несоответствия: удаляет устаревшие и ненужные пакеты, скачивает (или подтягивает из кэша) новые и добавленные.
composer install
Задача команды composer install — установить зафиксированные зависимости проекта.
Если composer.lock отсутствует, команда выполняет те же действия, что и composer update (включая создание lock-файла).
Итак, composer install использует зафиксированные в composer.lock зависимости как готовую инструкцию для установки/обновления, а composer update игнорирует этот файл и производит установку/обновление с нуля.
Может быть всё-таки заигнорить?
Нет. Игнорировать можно девушку или парня, чтобы подогреть интерес к себе (только не переборщите!). composer.lock же, напротив, сразу готов с вами сотрудничать.
Не храня lock-файл в репозитории, вы отказываетесь от механизма фиксации зависимостей. Несмотря на то, что composer.lock будет в любом случае сгенерирован, Composer не сможет гарантировать, что установленные пакеты будут иметь те же версии, что при разработке.
Почему упал продакшн?
Как вы теперь поняли, история из предисловия (основанная на реальных событиях) демонстрирует ошибочную цепочку рассуждений. И вот каким образом она может привести к беде.
Допустим, есть composer.json следующего содержания:
Как с этим жить
Composer для самых маленьких
Когда я первый раз разбирался с composer, я набросал для себя маленькую шпаргалку и теперь, спустя некоторое время представляю её на суд общественности в несколько доработанном виде.
Данная публикация актуальная для тех, кто в первый раз столкнулся с незаменимым менеджером пакетов для PHP.
Итак, Composer — менеджер пакетов для PHP.
Для чего нужен Composer и простейший пример его использования
Возьмем для примера этот проект
Если в двух словах: то это набор скриптов для работы в VK API
Соответственно, для работы этих скриптов нужно несколько библиотек
Библиотеки перечислены в файле composer.json — ключевой файл при работе с composer
В этом проекте используется 5 библиотек. Соответственно, если разработчик решит опубликовать этот проект на github, то ему достаточно закинуть в репу саму папку со скриптами и составить composer.json, в котором будут описаны библиотеки, необходимые для работы этого проекта. Простота очевидна: в репу не нужно вслед за файлами прицепом тащить все нужные библиотеки. Занимает меньше места, проще распространять проект.
В папке scripts лежат непосредственно скрипты проекта, для работы которых и требуются эти 5 пакетов.
Запускаем установку пакетов:
После установки появляется папка vendor, куда складываются установленные пакеты и формируется файл autoload.php
Этот файл подключаем к проекту и всё — библиотеки подключены, можно спокойно с ними работать.
Простота очевидна: не нужно скачивать и подключать библиотеки и их зависимости самостоятельно, composer всё сделает за Вас. И вся эта пачка подключается одним единственным файлом autoload.php
Все пакеты, которые лежат в vendor, добавляются в автозагрузчик. При этом composer опирается на файлы composer.json, которые должны быть у каждого пакета. Формирование composer.json пакета — это задача разработчика пакета, от потребителя пакета требуется лишь описать в composer.json проекта, какие пакеты нужно подключить.
Это пример composer.json проекта:
Это пример composer.json пакета:
В секции require прописана зависимость этого пакета — библиотека guzzle http, необходимая для работы библиотеки getjump/vk. В данном случае, т.е. с точки зрения потребителя пакетов, всевозможные зависимости пакетов — это не наша «забота», с зависимостями composer разберётся сам.
Пространство имён пакета прописано в секции autoload
getjump\\Vk\\ — наименование пространства имён
src/getjump/Vk/ — директория, в которой лежат файлы с классами пакета
Работа с этой библиотекой в проекте:
Core и Friends — это классы библиотеки, которые разложены и прописаны в папке src в соответствии со стандартом PSR-4. Опять же формирование структуры пакета — это работа создателя пакета.
Нам, как потребителю пакета, достаточно прописать в наш проект
include ‘../vendor/autoload.php’;
и все эти классы и пространства имён будут отлично работать.
При этом нам не нужно заморачиваться и писать автозагрузчик. Composer это сделает сам при выполнении команды install.
Установка
Установка Composer глобально
1) Для начала нужно что бы путь к директории с интерпретатором PHP был прописан в переменной окружения path.
Проверим, так ли это:
php –version
Далее нас будет интересовать переменная path:
Вписываем путь к интерпретатору
*С давних времён у меня на компьютере лежит сборка xampp, сама сборка здесь нафиг не нужна, а вот интерпретатор с неё вполне подойдёт (версия PHP – 5.6).
3) Добавим в переменную окружения path путь к composer.bat, например для D:\bin должно получиться:
Дополнительно можно добавить в path
D:\Users\%userName%\AppData\Roaming\Composer\vendor\bin\
для того, что-бы было удобнее использовать инструменты, глобально установленные через Composer.
(У меня папка Users располагается на диске D, а на C создан симлинк на неё).
Всё, composer установлен и полностью готов к работе.
Ещё: при установке можно словить ошибку
[RuntimeException]
The APPDATA or COMPOSER_HOME environment variable must be set for composer to run correctly
Решение нашлось здесь github.com/composer/composer/issues/2033
Добавляем переменную APPDATA со значением D:\Users\GSU\AppData\Roaming
Установка Composer локально
Отличия глобальной и локальной установки
Команды запускаются по разному при локальной и глобальной установках:
Например:
Локально: php composer.phar require silex/silex
1.1
Глобально: composer require silex/silex
При глобальной установке этот файл не нужен. Composer запускается при любой текущей директории.
Команды
Синтаксис composer.json
Именование пакетов и варианты описания пакетов
Имя пакета состоит из двух частей разделёных косой чертой: названия поставщика (vendor name) и названия библиотеки.
Если пакет оформлен в соответствии со стандартом PSR-4, но опубликован не на packagist.org, а на github, то вместо версии пакета нужно прописать ветку и репозиторий для этого пакета:
Пример подключения библиотеки, которая лежит на github, но при этом не оформлена по стандарту PSR-4, а представляет из себя обыкновенное нагромождение файлов с классами и функциями.
Pqr/superlib — эта та самая «неправильная» библиотека.
В секции repositories для неё пишем такую конструкцию
Ключевой момент — секция autoload, здесь указываем нужные нам файлы с классами и функциями.
Структура библиотеки:
Руководство по использованию Composer для начинающих
В этой статье рассмотрим, что такое Composer, как его установить и использовать. Другими словами, разберем как его «готовить» для начинающих.
Что такое PHP Composer
Например, для того чтобы в некоторый разрабатываемый проект добавить сторонние библиотеки, в нём можно просто создать «composer.json» и описать в этом файле все необходимые зависимости. После этого для установки всех требуемых внешних php пакетов в проект достаточно будет ввести в консоли всего одну команду ( composer install ).
Кроме этого, Composer применяется не только для установки php библиотек. С помощью Composer осуществляется также установка различных php фреймворков (Laravel, Yii2, Symfony и др.) и CMS (Drupal, MODX 3 и др.).
Composer представляет собой обычный php скрипт, т.е. программу, написанную на языке php.
Основная цель этой программы заключается в том, чтобы предоставить веб-разработчику удобный инструмент, с помощью которого он сможет очень просто загружать и устанавливать пакеты в проект, их обновлять, а также при необходимости осуществлять их удаление. Все эти действия Composer позволяет выполнить с помощью ввода всего одной или нескольких команд. Удобно, не правда ли?
В качестве репозитория пакетов Composer по умолчанию использует packagist.org.
При установке php пакетов Composer не просто устанавливает их, он также устанавливает все зависимости, от которых эти пакеты зависят. Т.е., например, если загружаемая библиотека будет зависеть от 3 других пакетов, а каждая из них, ещё в свою очередь от нескольких и так далее, то Composer всё это установит автоматически. В противном случае, т.е. без использования Composer, загрузку и установку основных пакетов, а также всех зависимостей придётся выполнять самостоятельно.
Загрузку сторонних библиотек Composer выполняет в папку «vendor», которую данный php скрипт создаёт в корневой директории проекта. Кроме этого, он ещё создаёт специальный файл «autoload.php», включив который в проект вы сразу же подключите к нему все ранее загруженные им библиотеки.
Основное назначение файла «composer.lock» заключается в полном сохранении среды, в которой осуществлялась разработка и тестирование проекта.
Работа с Composer осуществляется в основном в консольном или терминальном режиме, т.е. с помощью ввода команд через командную строку.
Официальный сайт Composer расположен по адресу https://getcomposer.org
Если вы использовали npm, то Сomposer – это нечто подобное, только не для «node.js», а для php.
Как установить Composer
Установка Composer может выполняться по-разному. Она также зависит от используемой среды и операционной системы. Рассмотрим различные варианты.
Установка Composer в Ubuntu, выполняющейся в подсистеме Windows для Linux (WSL)
Как установить локальный веб-сервер для разработки php проектов на подсистему Windows для Linux в Windows 10 можете ознакомиться в этой статье.
Для установки Composer в Windows 10 на подсистему Windows для Linux (WSL) необходимо выполнить следующие команды:
Первая команда выполняет загрузку скрипта установщика с сайта «getcomposer.org». Вторая команда выполняет запуск этого установщика. В процессе своей работы установщик проверит некоторые настройки «php.ini», предупредит вас, если они установлены неправильно, а затем загрузит последний «composer.phar» в текущий каталог. Последняя или третья команда просто удалит загруженный установщик, который ранее использовался для установки Composer.
Phar — это исполняемые файлы (программы), которые выполняются посредством php интерпретатора.
Если при установке php пакетов у вас выводиться ошибки на отсутствие прав записи в каталог «
/.composer/cache», то в командной строке просто запустите данную команду:
Эта команда переместит файл «composer.phar» из директории пользователя в директорию «/usr/local/bin» и уберёт у него расширение «phar».
Установка Composer на OpenServer (в Windows)
В OpenServer по умолчанию уже установлен Composer. Находится он в зависимости от выбранной версии PHP (устанавливается в настройках OpenServer) в директории «OSPanel\modules\PHP_*\».
Работа с Composer в OpenServer по умолчанию осуществляется в собственной консоли. Для того чтобы открыть эту консоль необходимо нажать на значок Open Server правой кнопкой мыши в области уведомлений и в открывшемся контекстном меню найти соответствующий пункт.
В консоли для проверки того, что Composer подключен, например, можно ввести команду:
Эта команда также отобразит версию Composer.
Если при выполнении этой команды отобразится сообщение, что версия Composer устарела, то её можно обновить. Осуществляется это посредством выполнения следующей команды:
Установка Composer на хостинг
Для установки Composer на хостинг, можно просто скачать данную программу самостоятельно, а затем загрузить её в корневую директорию проекта, например, с помощью FTP.
Самостоятельная загрузка нужной версии Composer выполняется со страницы «Download». Версии программы на данной странице расположены в разделе «Manual Download».
Выполнение команд на удалённом сервере обычно осуществляют с помощью SSH. По умолчанию на shared хостингах данный сетевой протокол выключен. Для его включения необходимо найти соответствующий пункт в панели управления, открыть его и нажать в нем на кнопку «Включить SSH».
Если вы пользователь Windows 10, то клиент SSH включен в систему по умолчанию. Поэтому для выполнения команд на удаленном сервере, можно в этой версии Windows не устанавливать никакой дополнительный софт, а например, воспользоваться программой «Командная строка» или «Windows PowerShell».
Основные команды Composer
Разберем основные команды Composer для начинающих.
Если вы используете «composer.phar» локально, то приведённые команды необходимо соответственно изменить в зависимости от того как настроено ваше окружение.
Например, если файл «composer.phar» находится в текущем каталоге и интерпретатор php доступен без указания пути к нему, то установка пакета будет осуществляться так:
Установка пакета
Установка пакета через Composer осуществляется посредством выполнения следующей команды:
vendor — это имя поставщика php пакета, а package — это его название.
Например, добавление в проект пакета twig через composer будет осуществляться так:
Команда require не только загрузит требуемую библиотеку в проект, но и пропишет её ещё в файле «composer.json», т.е. обновит его. Если устанавливаемый пакет зависит от других библиотек, то они также будут установлены или обновлены. Кроме этого ещё будет обновлён файл «composer.lock».
Установка всех пакетов в проект
Установка сразу всех пакетов в проект осуществляется посредством команды:
Эта команда работает следующим образом:
Обновление зависимостей
Команда для обновления установленных библиотек:
Эта команда обновит все зависимости установленные в проекте до последних версий (в соответствии с «composer.json») и файл «composer.lock».
Если необходимо обновить не все пакеты, а один или несколько, то их необходимо перечислить через пробел.
Команда для обновления одной библиотеки:
Удаление пакета
Команда Composer для удаления пакета из проекта:
Для удаления одновременно нескольких пакетов можете их перечислить через пробел:
Обновление Composer
Команда для обновления Сomposer до последней версии:
Обновление lock файла без обновления пакетов
Для обновления файла «composer.lock» без обновления самих пакетов:
Создать новый проект
Создание нового проекта из указанного пакета в текущую директорию выполняется так:
Создание нового проекта в указанную директорию выполняется так:
Вывод всех установленных библиотек
Команда для отображения всех установленных php пакетов:
Проверка валидности файла «composer.json»
Команда с помощью которой можно проверить валидность файла «composer.json»:
Вывод списка всех доступных команд
Вывести на экран все доступные команды Composer можно так:
Очистка внутреннего кэша пакетов Composer
Выполнение очистки внутреннего кэша пакетов Composer осуществляется с помощью команды:
Получение подробной справки по команде
Вывод подробной справки по команде:
Например, вывести подробную инструкцию по использованию команды require можно следующим образом:
Вывести зависимости для указанного пакета
Вывести все зависимости указанного пакета от других можно с помощью команды:
Создание базового варианта файла composer.json с помощью мастера
Создание базового варианта файла composer.json с помощью мастера, т.е. посредством ответов на вопросы:
Примеры использования Composer для установки PHP фреймворков и CMS
Установка фреймворка Laravel в текущую директорию осуществляется через Composer посредством ввода следующей команды:
Установка последней версии фреймворка Yii2 через Composer:
Установка разрабатываемой версии MODX Revolution 3 через Composer:
Установка через Composer нового приложения Symfony, предназначенного для создания традиционных веб-приложений:
Установка Symfony для использования его для создания микросервисов, консольных приложений или API осуществляется так:
Установка Drupal через Composer:
Как удалить Composer
Composer — это файл. В большинстве случаев для удаления его достаточно просто удалить.
Если вы не помните куда был установлен Composer, то просто поищете, например, с помощью встроенной системы поиска операционной системы этот файл.
Но так удалять не всегда корректно, все зависит от того, как вы его устанавливали. Если у инструмента, с помощью которого вы его устанавливали, есть возможность и его удаление, то выполняйте это действие с помощью этого инструмента.
Например, если вы Composer устанавливали с помощью инструмента apt-get, то и используйте его для удаления этой программы.
Например, если вы устанавливали Сopmoser в Windows с помощью программы Composer-Setup.exe, то удаления программы выполняйте стандартным образом через «Приложения и возможности» (только в Windows 10) или через «Удаление или изменение программы».
Дополнительно можно удалить папку с внутренним кэшем Composer. В Linux эта папка расположена в «/home//.composer», в Windows – «C:\Users\\AppData\Roaming\Composer».
Для чего нужен composer lock
Примечание: для простоты в этом ознакомлении будем считать, что Вы выполнили локальную установку Composer
composer.json : Настройка проекта
Чтобы начать использовать Composer в Вашем проекте, всё, что Вам нужно это composer.json файл. Этот файл описывает зависимости Вашего проекта и может содержать также другие метаданные.
Как Вы можете видеть require принимает объект состоящий из имени пакета (например monolog/monolog ) и версии пакета (например 1.0.* ).
Ограничения для версий можно указать несколькими способами, читайте версии для получения более подробной информации по этой теме.
По умолчанию только стабильные релизы принимаются во внимание. Если бы Вы хотели бы также получить зависимости RC, beta, alpha или dev версий, Вы можете это сделать с помощью флагов стабильности (stability flags). Чтобы применить это для всех пакетов, вместо того чтобы делать это для каждой зависимости, Вы также можете использовать настройку минимальная стабильность (minimum-stability).
Чтобы установить зависимости для Вашего проекта просто запустите команду install
Вы заметите, что команда install также создала файл composer.lock
composer.lock фиксирует Ваши приложения (наряду с composer.json ) в системе контроля версий.
Это важно потому, что команда ‘install’ проверяет присутствует ли файл блокировки, и если это так, он загружает указанные там версии (независимо от того, что говорит composer.json ).
Это означает, что любой, кто настраивает проект, будет загружать точно такие же версии зависимостей. Ваш CI сервер, рабочая машина, другие разработчики в Вашей команде, все они и всё работает на одних и тех же зависимостях, что снижает потенциал для ошибок, затрагивающих только некоторые части развертывания. Даже если Вы разрабатываете самостоятельно, через шесть месяцев при переустановке проекта, Вы можете быть уверены, что установленные зависимости по-прежнему работают даже если зависимости выпустили много новых версий с тех пор.
Примечание: Composer отобразит предупреждение при выполнении команды install если composer.lock и composer.json не синхронизированы.
Если Вы хотите установить или обновить только одну зависимость, Вы можете сделать это следующим образом:
Packagist является главным репозиторием (хранилищем) Composer. Репозиторий Composer это основной источник пакетов: место, откуда Вы можете получить различные пакеты. Packagist стремится быть центральным репозиторием который используют все. Это означает, что можно автоматически затребовать require для любого пакета который доступен здесь.
Если Вы перейдёте на веб-сайт Packagist (packagist.org), здесь Вы можете просматривать и искать пакеты.
Любой проект с открытым кодом используемый с Composer рекомендуется публиковать на Packagist. Библиотекам не обязательно нужно находиться на Packagist чтобы использовать Composer, но это позволяет более быстро обнаруживать их и пробовать их другими разработчиками.
Это делает библиотеку очень простой в использовании третьей стороной. Например: Если Ваш проект зависит от Monolog, Вы можете просто начать использовать классы из него, и они будут видны.
Включая этот файл, он также будет возвращать экземпляр автозагрузчика, так что Вы можете хранить его возвращаемое значение в переменной и добавлять больше пространств имен. Это может быть полезно для автоматической загрузки классов в наборе тестов, например.
В дополнение к PSR-4 автозагрузке Composer также поддерживает PSR-0, classmap и файловую автозагрузку. Смотрите раздел autoload (автозагрузка) для получения большей информации.
Примечание: Composer предоставляет свой собственный автозагрузчик. Если Вы не хотите использовать его одного, Вы можете просто включить файлы vendor/composer/autoload_*.php которые возвращают ассоциативные массивы, позволяя Вам настроить свой собственный автозагрузчик.
Освоение Composer: советы и приемы использования
Предлагаю читателям «Хабрахабра» перевод статьи «Mastering Composer – Tips and Tricks» за авторством Bruno Skvorc.
Composer произвел революцию в управлении пакетами в PHP и помог разработчикам по всему миру создавать независимый от фреймворков и разделяемый код. Но все же мало кто выходит за рамки основ его функционала, так что данная статья постарается осветить некоторые полезные приемы его использования.
Глобальная установка (Global)
Несмотря на то, что данная опция доступно описана в документации, Composer может (а в большинстве случаев должен) быть установлен глобально. Глобальная установка означает, что вместо:
Вы можете в любом проекте просто ввести:
Это позволяет очень просто создавать новые проекты (например, с помощью команды create-project) в любом месте вашей файловой системы.
Для установки Composer глобально, следуйте этим инструкциям.
Правильная установка зависимостей
Just add the following to your composer.json file:
Но данный подход имеет несколько недостатков. Во-первых, простой копипаст может привести к возникновению ошибок. Во-вторых, для новичка может быть не очевидно, где разместить данный код, если у него и так уже имеется обширный файл composer.json, и это также привести к ошибке. Наконец, некоторые люди будут иметь дело с Composer впервые, а возможно и впервые столкнутся с командной строкой. Поэтому хорошей практикой будет освещение всевозможных случаев, в которых новички могут чувствовать себя неуверенно (есть ли у них графический редактор или они будут использовать командную строку? Если второе, установлен ли в ней текстовый редактор, и если да, то какой? Объясняете ли вы саму процедуру редактирования файла? А что если файла composer.json ещё не существует в проекте? Описываете ли также принцип создания нового файла?).
Наилучший способ добавить новую зависимость в файл composer.json — это воспользоваться командой require:
Это добавит все необходимое в файл зависимостей, минуя ручное вмешательство.
Если вам нужно добавить пакеты в раздел require-dev, добавьте в команду опцию —dev:
Также, команда require поддерживает добавление нескольких пакетов одновременно, для этого просто разделите их пробелом.
Файлы блокировок
Файл composer.lock сохраняет текущий список установленных зависимостей и их версии. Таким образом, на момент, когда версии зависимостей уже будут обновлены, другие люди, которые будут клонировать ваш проект, получат те же самые версии. Это позволяет убедиться в том, что каждый, кто получает ваш проект, имеет “пакетное окружение”, идентичное тому, которое вы использовали при разработке, и помогает избежать ошибок, которые могли бы возникнуть из-за обновления версий.
Файл composer.lock почти всегда должен быть добавлен в систему контроля версий (не всегда).
Версионирование
Репетиции (Dry Runs)
Чтобы просто посмотреть, пройдет ли установка новых зависимостей успешно, вы можете использовать параметр —dry-run для команд install и update. Composer в данном случае выведет все потенциальные проблемы без непосредственного выполнения самой команды. Никаких реальных изменений в проекте не произойдет. Этот прием отлично подходит для тестирования сложных зависимостей и настройки изменений перед реальным их внесением.
Создание проекта
Последнее, но не менее важное, что мы должны упомянуть — это команда create-project.
Команда создания проекта принимает в качестве аргумента имя пакета, который она затем клонирует и выполняет composer install внутри него. Это отлично подходит для инициализации проектов — не нужно больше искать Url нужного пакета на GitHub, клонировать его, самому переходить в папку и выполнять команду install.
Крупные проекты, такие как Symfony и Laravel, уже используют данный подход для инициализации своих «skeleton» приложений, и многие другие также присоединяются.
Например, в Laravel это используется следующим образом:
В команду create-project можно передать еще два параметра: путь, в который нужно установить проект (если не указан, используется имя пакета), и версия (будет использована последняя, если не указать).