Composer
Эту статью можно было бы также назвать "Composer для самых маленьких".
Однако, здравствуйте.
Данная публикация актуальная для тех, кто в первый раз столкнулся с незаменимым менеджером пакетов для PHP.
Итак, Composer — менеджер пакетов для PHP.
Для чего нужен Composer и простейший пример его использования
Возьмем для примера этот проект.
Если в двух словах: то это набор скриптов для работы в VK API. Соответственно, для работы этих скриптов нужно несколько библиотек. Библиотеки перечислены в файле composer.json — ключевом файле при работе с composer.
Пример composer.json
В этом проекте используется пять библиотек. Если разработчик решит опубликовать этот проект на github, то ему достаточно закинуть в репозиторий папку со скриптами и составить composer.json, в котором будут описаны библиотеки, необходимые для работы этого проекта. В репозиторий не нужно вслед за файлами прицепом тащить все нужные библиотеки: занимает меньше места, проще распространять проект.
Пример работы.
Скачиваем проект:
![image](https://cdn.prod.website-files.com/62545ba8bc7ef1e96935845b/62603df722a2881aae010e63_MjwyUlgaqJsNlMZZKaFCtwafc8UqG0Mvsbujihr783_w0MQ6Ao9H7y_PhFaB2tdV394dUEXTA6dpHdot_rhsfgZG-KB7TpW6aU4KFhcvhhW0N5FdkMrmPledcG3T-dnbAMPOuZjM.png)
![image](https://cdn.prod.website-files.com/62545ba8bc7ef1e96935845b/62603ec63790bf2b690280ea_wGwBTj2Amkeol8gCzh04aTvNfR69ocJJFOUzujEXZ5qLiUkgMf6vhEOIY6_ZOiaaNH5Xm9m2HumO9FJBvDwnUzib3xz3g6sHs3jKQOGv12SqGOTSjf6znRNWXDv3toOIfa9ugGe9.png)
После установки появляется папка vendor, куда складываются установленные пакеты и формируется файл
autoload.php
![image](https://cdn.prod.website-files.com/62545ba8bc7ef1e96935845b/62603ef44f65c5999f313918_wEvx3sXgTrbAYKzBu7zyhYAMVg2uicCeiBwj31MNol6Ol5JB5Y3SKv_qBJpniNygO0C5gQrorvOQfOWW044j4C4b-dyfsrWEU9P0MluRmavpKHq2kBaSYl4_hplO_CMIJms82jEz.png)
![image](https://cdn.prod.website-files.com/62545ba8bc7ef1e96935845b/62603f09241d61168bc2f503_a-b9TFhOyF05gw8-74eaAsZzvaYTKb9jMYRUVU-pg0UcWKLxPJyoMrwgF2ajpFi4fBqwPrdU-dI-4hUPpc19rRUZ6LMU-Qtd389lSOF4t3yLrzUPwhpw9H5XthczRu3LYmjUFJIF.png)
Этот файл подключаем к проекту и всё: библиотеки подключены, можно спокойно с ними работать.
Простота очевидна: не нужно скачивать и подключать библиотеки и их зависимости самостоятельно, 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/ — директория, в которой лежат файлы с классами пакета.
src/getjump/Vk/ — директория, в которой лежат файлы с классами пакета.
Пример работы с этой библиотекой в проекте:
![image](https://cdn.prod.website-files.com/62545ba8bc7ef1e96935845b/6260f4295f2492b763d3b3d6_5zVUxGzGEmgvgMELbC3XWTAOaljBJPf4xeHo3rd4CF90s2JPCvJrmZygLNIpUKVy3UnUz_tRwU-DYKP0WHxw7EAmkrsw-hB-ot_m7lVd5gdwVXuIt802z-9IbgBka8nuh5iXWmpE.png)
Core и Friends — это классы библиотеки, которые разложены и прописаны в папке src в соответствии со стандартом PSR-4. Опять же формирование структуры пакета — это работа создателя пакета.
Нам, как потребителю пакета, достаточно прописать в наш проект:
Установка
Установка Composer глобально
1) Для начала нужно, чтобы путь к директории с интерпретатором PHP был прописан в переменной окружения path. Проверим, так ли это:
![image](https://cdn.prod.website-files.com/62545ba8bc7ef1e96935845b/62610508c0eafd29e655fa58_1WKuHS4th84vJwSNBNFU9SvODHgTnY1MuSXit-4vw5zVRDIgq-b1i27-Y4q74TbPrTQC7uTaM2G0hq4YchBOQeYKZdlnLghWf6k_DH5sf7doym82A10HzrEuCJv7QiMptf2jqv34.png)
Если вывод получился типа такого, то этот шаг можно пропустить.
На примере Windows 7
Система -> Дополнительные параметры системы -> Дополнительно -> Переменные среды. Далее нас будет интересовать переменная path:
![image](https://cdn.prod.website-files.com/62545ba8bc7ef1e96935845b/62610546904aaf3e060845a5_uCPjwgRWbHpi0mSki_wUBiZTS8kYMOdXlSxdaDdTTEfGhSg4JcM2ZqJ0cbYybIcGjRoTp0_oxI2vkHkbD1oVXUIFhQMDKLqj-5dXghoR0rWBMgaNNqkrxnhyV_5w0HFE7eWiUxGz.png)
Вписываем путь к интерпретатору:
![image](https://cdn.prod.website-files.com/62545ba8bc7ef1e96935845b/6261058254a78a3b3c82a1a1_qEAZAFcUxsSJssu6URXR4x9FxQ-J6zNYrN5gSpJCV79xZexTAklbCwEzZUi4iD1QbcY2gYod75bOUpKmwbajExkdp7AowShh3Viuz1073FNJ8AIDsgom83obLe38VMgE_LwhBk-D.png)
* С давних времён у меня на компьютере лежит сборка xampp, сама сборка здесь не нужна, а вот интерпретатор с неё вполне подойдёт (версия PHP – 5.6).
2) Перезапускаем терминал.
Создаём директорию и ставим composer (я ставил на диск D):
![image](https://cdn.prod.website-files.com/62545ba8bc7ef1e96935845b/626105d2904aafd32408a763_oA6ZTuoeUPTARIrTcYr1BhnyLkPieeAPC83kNbhqMnrO3gRAmLjdcq0BMs-vogUBWOAPcK3ctM5mZj5HWSl_tS9FIoaJrgkt241jl25us6oCSnUEhW2VLm3i5EYIgAhrle9CK3nK.png)
3) Добавим в переменную окружения path путь к composer.bat, например для D:\bin должно получиться:
![image](https://cdn.prod.website-files.com/62545ba8bc7ef1e96935845b/62610692622fe0fdd203637a_ePfmK3o0sV6who6Qc3YPkAxvve9mBKys5oZ0at55qjOzb1i9LJkKYiAxaLoUiSlXWRc3OPGOR7CpnnGqy6FzS_r4yuDa04DPWjsphI_wOFBtHYIAIH-3KA3Bri63oJxN7eqkTTE9.png)
Чтобы было удобнее использовать инструменты, глобально установленные через Composer, дополнительно можно добавить в path:
* У меня папка Users располагается на диске D, а на C создан симлинк на неё.
Всё, composer установлен и полностью готов к работе.
Ещё при установке можно словить ошибку:
Решение нашлось здесь github.com/composer/composer/issues/2033
Добавляем переменную
D:\Users\GSU\AppData\Roaming
![image](https://cdn.prod.website-files.com/62545ba8bc7ef1e96935845b/6261073bf055f58dc3e426ec_xK7os8G9RS1xGnmNX1gRCrATdorBHfRFhwVGRYEJVxPFqJJ6QAJr01oUr2aKE93ujHYmZCGFC1Hr3evm9iqSCwcyYLFkv_WpSbW1AShuEcv7AUkCukaBII2nXwEL1E5Z90hiObPL.png)
Установка Composer локально
Есть вариант поставить composer локально, но в большинстве случаев в этом нет явной необходимости.
Однако, тут установка ещё проще.
Так как программа глобально не установлена, нужен загрузочный файл (мини-программа composer). Для его загрузки пишем команду:
Теперь в директории проекта появился файл composer.phar
Composer готов к использованию:
Отличия глобальной и локальной установок
Команды запускаются по-разному при локальной и глобальной установках:
Например:
- локально: php composer.phar require silex/silex ~1.1
- глобально: composer require silex/silex ~1.1
При локальной установке нужно каждый раз скачивать установочный файл в папку текущего проекта
При глобальной установке этот файл не нужен. Composer запускается при любой текущей директории.
Команды
install — установка пакетов, прописанных в composer.json.
update – обновление пакетов.
dumpautoload — пересборка автозагрузчика.
require somepackage/somepackage:someversion — добавление нового пакета (по умолчанию пакеты ставятся из оф. репозитория). При установке пакет прописывается в composer.json.
update --lock — обновление файла блокировки composer.lock.
config --global cache-files-maxsize «2048MiB» — пример изменения параметра конфигурации.
--profile — добавление этого параметра к любой команде включит показ времени выполнения и объёма использованной памяти.
--verbose — подробная инфомация о выполняемой операции.
show --installed — список установленных пакетов с описанием каждого.
show --platform — сведения о PHP.
--dry-run — репетиция выполнения команды. Может добавляться к командам install и update. Эмулирует выполнение команды без её непосредственного выполнения. Необходима, чтобы проверить, пройдёт ли установка пакетов и зависимостей успешно.
remove — удаление пакета. Точная противоположность require.
Синтаксис composer.json
Имя пакета состоит из двух частей разделёyных косой чертой: названия поставщика (vendor name) и названия библиотеки.
Если пакет оформлен в соответствии со стандартом PSR-4, но опубликован не на packagist.org, а на github, то вместо версии пакета нужно прописать ветку и репозиторий для этого пакета:
Пример подключения библиотеки, которая лежит на github, но при этом не оформлена по стандарту PSR-4, а представляет из себя обыкновенное нагромождение файлов с классами и функциями:
![image](https://cdn.prod.website-files.com/62545ba8bc7ef1e96935845b/62612ed0526fff3ec8b3906a_QZ_yfge2-xLYLllSr4cjf6v_88VeEqSnWReDsQtcbKpbHFWPoOVuX2cPThIkrhGHw3C_76JAosp4Uuf83PEAFg74r9Vl8mZ1CbjTzzAw_H1JNFssHonGzoA58iYSHS1SxnzEN76e.png)
Pqr/superlib — эта та самая «неправильная» библиотека.
В секции repositories для неё пишем такую конструкцию:
Ключевой момент: в секции autoload указываем нужные нам файлы с классами и функциями.
Структура библиотеки
![image](https://cdn.prod.website-files.com/62545ba8bc7ef1e96935845b/626134a3104ba58fbcaed2ac_6qm5vd3oS02V3fbygOm8qTeABJNhGLTsxkyydXFOa1SiXC_1rH0EoeodGb4jJTg9CAvqR4vnvTzHZddqltu1u1sWqUjFbBRJxdoKAWMQTTUh1fdiMNXqVPwIUNi7nPfBOGef-ZPz.png)
Содержимое файлов
![image](https://cdn.prod.website-files.com/62545ba8bc7ef1e96935845b/6261395f38abf5454c8875bc_IlugO5tA-RS6dDyZvrmXPFUpf7vnSvLvuRHbHinI7aY5O0doYWi4OV1MNGvfpqFV3ZHvh-ueFVpBp0BtIizhbxpQcHGKubMWa1xzLKoP05jIQJVbGBOgia64JS4A3Mu-Pzod0ZIn.png)
![image](https://cdn.prod.website-files.com/62545ba8bc7ef1e96935845b/626139731e7e700f85304ade_h-obzzMOeG0InQOz-08ODu_U7jW5Limt1SX5ZTjhrJJVr2eZqR-htLAzwXn8rllT628yLORpXQQctpRsS_u-o9977dRCZIDEJrAXWoSECwf0WSWKzP8V4uFpfoJMVi3Eg6D7qGm2.png)
Соответственно, в проекте вызов getCurrentTime() будет выглядеть примерно так:
Версионирование
При указании допустимых версий пакетов можно использовать точное соответствие (1.2.3), диапазоны с операторами сравнения (<1.2.3), комбинации этих операторов (>1.2.3 <1.3), “последнюю доступную” (1.2.*), символ тильды (~1.2.3) и знак вставки (^1.2.3).
Указание тильды (~1.2.3) будет включать в себя все версии до 1.3 (не включительно), так как в семантическом версионировании это является моментом внедрения новых функциональных возможностей. В данном случае будет получена последняя из стабильных минорных версий, то есть будет меняться только последняя цифра — 1.2.5, 1.2.8 и т.д.
Указание знака вставки (^1.2.3) буквально означает “опасаться только критических изменений” и будет включать в себя версии вплоть до 2.0. Применительно к семантическому версионированию, изменение мажорной версии является моментом внесения в проект критических изменений, так что версии 1.3, 1.4 и 1.9 подходят, в то время как 2.0 — уже нет, то есть не меняется только первая цифра.
Тильда: ~1.2.3 — это самый распространённый и безопасный способ указания версии.
Файл composer.lock
Файл composer.lock сохраняет текущий список установленных зависимостей и их версии. Таким образом, когда версии зависимостей уже будут обновлены (команда update), другие люди, которые будут клонировать ваш проект, получат те же самые версии. Это позволяет убедиться в том, что каждый, кто получает ваш проект, имеет пакетное окружение, идентичное тому, которое вы использовали при разработке, и помогает избежать ошибок, которые могли бы возникнуть из-за обновления версий.
При каждом выполнении команды update версии обновлённый пакетов прописываются в composer.lock. Этот файл загоняется под систему контроля версий и при установке пакетов на новом сервере поставятся именно те версии пакетов, которые прописаны в этом файле. При выполнении команды install composer будет в первую очередь опираться на composer.lock. Таким образом, на разных серверах будет гарантированно установлено одинаковое пакетное окружение с точки зрения версий.
Также файл composer.lock содержит хэш файла composer.json. И если json-файл был отредактирован, то composer выдаст предупреждение, что файл lock не соответствует json-файлу.
В таком случае нужно выполнить команду composer update --lock, которая обновит composer.lock:
composer update
![image](https://cdn.prod.website-files.com/62545ba8bc7ef1e96935845b/62613a57c70ee8151700ec4e__acc1mcdVEUgZYbsgtmo4Y4y5eipQO6x2fpjGUafLm5bxy9tzr3V5b07Zqx9rGeK-bx06qMrp91tOnT2OqK8CceGVGA1HyOWYLKbZU9LnNct8_wDfT4mToG9ZYUtRq7PmnAaKiux.png)
composer show --installed
![image](https://cdn.prod.website-files.com/62545ba8bc7ef1e96935845b/62613a7e7111d43b43a57575_btpGQ2JUhYqt5nJM75G5lLxYU0w1RZecHdpPysQgiUEJRXQIzPOpf6fiAULO8BhDNEHWalB7Rr4l2MUyUqHglf8k8j1N01sSCzPzu4h5uwt1oQ7vCIT_KCHdMnyc7AW6vU1vZArq.png)
composer install
![image](https://cdn.prod.website-files.com/62545ba8bc7ef1e96935845b/62613a9bbcc4d396b5c1a17e_yOT_G8s4QNgCwcrCV7uxU6r9uoEbGWraTa9h7YdZ_BilxGZwq9lGVoq3KF5NtaIVypEUvvhEAN0PCLwdXn_85BWIntZVJhVVQkMRen2o4UDLlITNSqBKvkNSb-tMPV9H9yAAKsgS.png)
![image](https://cdn.prod.website-files.com/62545ba8bc7ef1e96935845b/62613aac55af4d301166c72e_eLeKgqncS3GqtUxZ97aSkPZvVT33p_IDHp8QN2Wm1nOtc7tuu-VFjW2kdAOyN42SFSO9Tp1_zl6QYoEdqyo690BeruFsTB8RrhAIqlUbZYRKL-bjpjhvSvWSLRPdjD8u5f8oHGnN.png)
Отличие install от update в контексте использования composer.lock
Команда composer install проверяет, существует ли composer.lock:
- если нет, резолвит зависимости и создаёт его;
- если composer.lock: существует, устанавливает версии, указанные в нём.
Команда composer update:
- проверяет composer.json;
- определяет последние версии на основе указанных в этом файле;
- устанавливает последние версии;
- обновляет composer.lock в соответствии с установленными.
Пример использования с точки зрения создателя проекта
Имеем проект без установленных пакетов:
![image](https://cdn.prod.website-files.com/62545ba8bc7ef1e96935845b/62613b2e03fe553cc4ea4557_YQW7vN40s3zc7dubUPLzEF-QASpr8dHnt-27gkMKdLYf7764XyMENqQJLucqN4t80eoqz0JJn-aiH7RWjuOQJlnBufkk79OpxnqVXZzhbU5WKT8Wgt1hunxywZThLSEt2m5BT_W9.png)
Поставим несколько библиотек:
![image](https://cdn.prod.website-files.com/62545ba8bc7ef1e96935845b/62613b6333fd2268c52c1fad_oFp0K8W7TPn2NDoxAwb15NeEyJKzoxRpAsBW-Xuw4GZMn8LLJM_Dgv_GPe8WyEGyCkRFbK0_06o6wJ_62u2HoSqIawFcQH3yYaAuUHZPKVEcbmqB_dv1Y7VRbJZxvmk66KtNfgjC.png)
![image](https://cdn.prod.website-files.com/62545ba8bc7ef1e96935845b/62613b8d190419bdfda2f537_TGgbWRB6IPBIwup3qXFyWlI8Rmr_3x6ZO7GWP_50Wd4qJCIgQwVr7Pb-kBB7rCNjbyex3bAY-QWUEsfrx73ySxGh2AWCZF2MpZhBPUGSRYb7tosi7DrLnShUfYSNlkHa0gHH3NTo.png)
У нас сформировался composer.json с информацией о пакетах:
![image](https://cdn.prod.website-files.com/62545ba8bc7ef1e96935845b/62613ba794973dac6d82cf26_xg_vX53j1N1_QtxETWhisn3bfQFxydlTidzxfYRKF6DWLq00ZN6hF674VjEv0TKCnXzUNeqeqrOc1XVHnZpAXXbiqL1kFo5umrlZLzvfZb5gsGVUPqIjUr0Ri6VVbno3J0lKOZwz.png)
Мы можем его дополнить и распространять проект с этим файлом:
Другой пользователь скачал наш проект, выполнил install, и у него в проекте развернулись все нужные пакеты:
![image](https://cdn.prod.website-files.com/62545ba8bc7ef1e96935845b/62613be8cb0ccd0e71ee40df_zTeVcp-FinN_ctCJc1gSyYlMQQWnFahAk9ui4oAMuzLhbF1rJYnzIyMyZSYL7ZedfH5xHKSD8BcBT-c0jCQ-L2I1gHUmalC2oxdwHVtRm0eQMlhJ9ssDB5PbuL5mi1ryfW3vxOvZ.png)
Пример использования с точки зрения создателя пакета
Для примера я создал класс с методом, который будет выводить URL текущей страницы.
![image](https://cdn.prod.website-files.com/62545ba8bc7ef1e96935845b/62613c841effd37130b37302_ji29wqLYLQLwxWaAK9nv9ZXsbJTuJeCG_a8GQYZ_wZv06ZZUgyijNc9BZqxMVcoxedtJwZk9VDrqp1OCV9xPIe4yfcaJIK36iOgPemrXUPHDycI9HIwwfPfPWPu7jzvCaKjCmmUi.png)
Класс оформлен как пакет и залит на github.
![image](https://cdn.prod.website-files.com/62545ba8bc7ef1e96935845b/62613ca6104ba56134b3e8db_G142sb909N26Hwhil2ov0DEp4WU7XvYJMCrBuk3sRxZrU59hMFFWYtU5VfxcrKRcf5by0vjh9gGbXEor3IPNL3aVwd8se9_zDSZPuVbOCZ_zVTJ4hitFHGlMO5lhsV2rh_mtJP05.png)
Составлен composer.json:
Регистрируюсь на официальном репозитории и добавляю пакет, указывая ссылку на репозиторий, в котором он лежит:
![image](https://cdn.prod.website-files.com/62545ba8bc7ef1e96935845b/62613d1c104ba535f3b441a1_oH-3dY6if8hGalU0c2O8OZ2MIOl7LjqSUmQV5aTrFSZHVX1anve0OoKFSXbSHH2oLjRLf7OJlIAYyq_ZDogWq48RowdhXXsU4SPYkevb4ra0TpOoGkfQgmdLv1NDKihiSPGxmTIy.png)
Всё, пакет добавлен:
![image](https://cdn.prod.website-files.com/62545ba8bc7ef1e96935845b/62613d3ff20bf60f29c899d7_YP-Fe8U0BtdaE-SCqns25TZsPRGNF_WRxIhe86btoWT-k65-4DiYpyfvZ_D7PN1tp5yVT15MLofyaRhSx4rvoTAjbm6dcqqpnTz_yayFEpHU7d1dfxGq67chmNV7y4ge2nSRXeC2.png)
![image](https://cdn.prod.website-files.com/62545ba8bc7ef1e96935845b/62614b5d319ee75fa4a25e8d_x8IEiXWFlT1laKuaS9l6OGMlrfbB5kwK9JQu-wZORQ4l7w4qyJlHLolYryMeoZjPHo0yaiOY1tD5rQcGau8YL7wC0fh5jpi7kg_9G0ZldKFIKOqkCnIlr6-6MrCulBSf361WJMKh.png)
Проверяю работоспособность пакета:
![image](https://cdn.prod.website-files.com/62545ba8bc7ef1e96935845b/62614ba1130648b8e87d5dd1_BPVoFVO35FDw5CGvXgASOJfwIjKtUTf3GQaT8wAZjZMf-ucvCTLI2Rj_MLdEuvkFiNcV_8B5a0DykhF3SMkGDtNl8YtCn_gKne6uwGoypyxA6Z-ytpJX-kYRZXeDfBA7q2xUnIy0.png)
Читайте также
![](https://cdn.prod.website-files.com/617bb8097f7181c68177be89/64071568eebef41a1d81e3a2_YouTubeIco.png)
![](https://cdn.prod.website-files.com/617bb8097f7181c68177be89/6407187af3b88054dcca10bb_VCIco.png)
![](https://cdn.prod.website-files.com/617bb8097f7181c68177be89/64071568eebef41a1d81e3a2_YouTubeIco.png)
![](https://cdn.prod.website-files.com/617bb8097f7181c68177be89/6407187af3b88054dcca10bb_VCIco.png)
![](https://cdn.prod.website-files.com/617bb8097f7181c68177be89/64071568eebef41a1d81e3a2_YouTubeIco.png)
![](https://cdn.prod.website-files.com/617bb8097f7181c68177be89/6407187af3b88054dcca10bb_VCIco.png)
![](https://cdn.prod.website-files.com/617bb8097f7181c68177be89/64071568eebef41a1d81e3a2_YouTubeIco.png)
![](https://cdn.prod.website-files.com/617bb8097f7181c68177be89/6407187af3b88054dcca10bb_VCIco.png)