Як ви вже знаєте, [Composer](https://getcomposer.org/) - це надійний менеджер пакетів і залежностей для PHP, за допомогою якого можна елегантно керувати сотнями проектів одночасно і поширювати один раз написаний код в усі додатки одночасно.
Цей посібник є детальним всеосяжним керівництвом для розробників. Ми розглянемо всі важливі сучасні прийоми роботи з Composer, а також пояснимо технічні деталі та відповідні залежності.
Незалежно від платформи, завантажуємо з [офіційного сайту Composer] (https://getcomposer.org/).
Всередину завантажується PHP-файл composer-setup.php
, який при запуску в режимі CLI може встановити Composer. Також важливо знати, що Composer не працює без PHP, тому спочатку переконайтеся, що на вашому комп'ютері працює PHP (він повинен бути доступний тільки для Терміналу).
На Mac і Linux Composer працює відразу після інсталяції, і вам просто потрібно викликати команду composer -v
, щоб швидко перевірити, що Composer встановлений правильно.
В Linux для встановлення можна використовувати наступну команду: /usr/bin/php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
.
У Windows добре встановити інструмент Git Bash для Windows, який дозволяє відкрити специфічний термінал, який поводиться майже як Linux і дозволяє працювати в тому ж середовищі, що і в Linux.
Встановлення для серверів відбувається так само, як і в локальному середовищі. Просто переконайтеся, що у вас встановлена правильна версія PHP, яку Composer використовує всередині.
Композитор реалізує ряд команд.
Використання: composer <команда>
, наприклад: composer update
.
Огляд за 1.10.0
:
Команда | Опис / Значення |
---|---|
Відображає коротку інформацію про композитора. | |
Створює архів із вмістом вибраного пакета Composer. | |
browse |
Відкриває домашню сторінку вибраного пакета, автора або іншу пов'язану сторінку у веб-браузері. Часто може містити документацію про те, як ним користуватися. |
Очищає внутрішній кеш Composer від версій пакунків, завантажених у минулому. | |
check-platform-reqs |
Перевірте, чи виконані вимоги до установки для поточної платформи. |
Очистити внутрішній кеш Composer. | |
Очистити внутрішній кеш Composer. | |
create-project |
Створює новий проект на основі обраного пакета і автоматично створює папку для розміщення проекту. |
depends |
Показує, які пакети спричинили встановлення вибраного пакета. |
Діагностика | Діагностує систему для виявлення поширених помилок. Обробка вихідних даних залишається на розсуд розробника, це лише лістинг. |
dump-autoload |
Генерує новий завантажувач. |
dumpautoload |
Генерує новий завантажувач. |
Exec | Виконує двійкові файли та скрипти від Постачальника. |
Вивчає, як створювати/модифікувати ваші залежності. | |
global |
Дозволяє запускати глобальні команди Composer зі змінної $COMPOSER_HOME . |
Виводить довідку для команд. | |
Головна | |
Встановлює всі залежності проекту згідно з файлом composer.lock , якщо він існує і є дійсним. При виникненні проблеми використовується інформація з composer.json і composer.lock повертається в початковий стан. |
|
info |
Відображає інформацію про встановлені на даний момент пакети в проекті. Відображає назви всіх пакетів, їх поточні версії та короткий опис. |
init |
Створює базову функцію composer.json в поточному каталозі. |
install |
Встановлює всі залежності проекту відповідно до файлу composer.lock , якщо він існує і є дійсним. При виникненні проблеми використовується інформація з composer.json і composer.lock повертається в початковий стан. |
Відображає список всіх пакетів, їх версії та поточну ліцензію. | |
list |
Відображає список доступних команд. |
prohibits |
Показує, які пакети і залежності перешкоджають встановленню запитуваного пакета або версії. |
Видаляє пакет з розділу конфігурації require або require-dev . |
|
require |
Додає запитуваний пакет до composer.json та встановлює його. Якщо залежності не можуть бути виконані, він повернеться до початкового стану. |
run |
Запускає визначені скрипти в composer.json . |
run-script |
Запускає визначені скрипти в composer.json . |
Пошук пакунків за ключовим словом або пошуковим запитом. | |
Самооновлення | Оновлює внутрішній файл composer.phar до останньої версії. |
Самооновлення | Оновлює внутрішній файл composer.phar до останньої версії. |
status |
Відображає зведення про локальні зміни, внесені в пакети вручну, на основі порівняння з джерелом пакета, з якого він був спочатку встановлений. |
пропонує |
Відображає пропозиції щодо пакетів. Пропозиції можуть включати в себе різного роду дії, такі як встановлення оновлень безпеки тощо. |
update |
Оновлює весь проект відповідно до залежностей, щоб вони завжди всі задовольнялися composer.json . У разі успіху оновлює composer.lock , куди записує встановлені на даний момент версії. |
"апгрейд", він же "апдейт". | |
Псевдонім для оновлення. | |
Перевіряє файли composer.json та composer.lock на наявність синтаксичних помилок. |
|
why |
Показує, які пакунки спричинили встановлення поточного вибраного пакунка, включаючи всі залежності. |
why-not |
Відображає, які пакети та версії перешкоджають встановленню вибраного пакета або версії. |
Кожен проект, керований Composer, визначається файлом composer.json
в його корені, який визначає всі залежності. Файл може бути створений як вручну для існуючого проекту, так і автоматично при створенні проекту.
Оскільки в Composer все є пакетом, то і сам проект може базуватися на пакеті. Так, наприклад, якщо ви створюєте десятки або сотні дуже схожих проектів, має сенс винести їх базову конфігурацію і структуру в окремий пакет, на якому базувати інсталяцію.
Прикладом такого пакету є мій Baraja Sandbox, який базується на чистому Nette 3.0 і додає базову залежність до мого Package Manager, який я використовую для всіх проектів та управління залежностями в конфігурації Nette.
Потім пісочниця встановлюється просто за допомогою команди:
$ composer create-project baraja/sandbox <your-project-name>
На основі назви проекту Composer автоматично створить папку для інсталяції проекту (скопіює вміст пакунків та встановить залежності).
У папці vendor
Composer потім керує всіма пакетами (їх фізичні файли знаходяться там) і генерує автозавантаження класів, які ми в ідеалі поміщаємо безпосередньо в index.php
у вигляді рядка:
require __DIR__ . '/vendor/autoload.php';// Сам код програми
В рамках функціонального проекту ми можемо дуже легко встановлювати нові пакети та додавати залежності.
Для цього є 2 шляхи:
composer require ...
,composer.json
в розділі require
, а потім за допомогою команди composer update
.Спробуйте встановити наприклад PackageManager: composer require baraja-core/package-manager
, або Doctrine: composer require baraja-core/doctrine
.
Якщо вибраний пакунок не вдається встановити, можна запитати про конкретні причини, і Composer видасть список залежностей, які перешкоджають цьому. Часто достатньо виправити залежність від конкретної версії або видалити несумісний код. Для отримання детальної інформації скористайтеся командою: composer why baraja-core/doctrine
.
Добре продуманий проект розроблений таким чином, щоб ви могли легко завантажувати оновлення з плином часу і завжди мати найновіші версії всіх пакетів. Основна перевага полягає в тому, що ви отримуєте виправлення всіх помилок, часто покращення продуктивності та багато нових функцій. Крім того, поступовий перехід зробить оновлення менш складним через тривалий час, оскільки ви будете виправляти проблеми на льоту в менших масштабах і уникати несумісності.
Для оновлення всіх пакетів і залежностей використовуйте команду composer update
.
Сам процес оновлення в деяких випадках може завершитися зі збоями. Причиною зазвичай є або порушена залежність, або несумісний пакет.
Для отримання детальної інформації про те, чому не вдається встановити пакет, скористайтеся командою: composer why-not baraja-core/doctrine
. Якщо у нас вже є пакет і не працює тільки конкретна версія (не хоче встановлюватися), ми також можемо попросити конкретну версію: composer why-not baraja-core/doctrine:v1.0.20
.
У файлі composer.json
ми також можемо перерахувати залежність від конкретного часу виконання. Це особливо корисно, коли ми розробляємо проект з кількома людьми і хочемо перевірити, що у них встановлені всі розширення.
Як правило, перевіряється версія PHP (повинна бути не нижче 7.1.0
):
{"require": {"php": ">=7.1.0"}}
Можливі й інші розширення системи:
{"require": {"php": ">=7.1.0","ext-json": "*","ext-session": "*","ext-PDO": "*"}}
Ці правила потім враховуються при встановленні пакетів або оновлень. Це допомагає запобігти проблемам, які могли б проявитися під час виконання програми. Зазвичай, наприклад, пакету платіжного шлюзу необхідно взаємодіяти з API, тому він повинен допускати залежності від розширень curl
та json
.
Часто порушення залежностей виникають через погану версію PHP. У цьому випадку Composer видає повідомлення, наприклад, "ваша версія PHP (7.3.11), перевизначена версією "config.platform.php" (7.1), не задовольняє цій вимозі".
Дуже часто помилка викликана налаштуваннями безпосередньо в проекті composer.json
, де знаходиться наступна секція:
"config": {"platform": {"php": "7.2"}}
Зміна повинна бути внесена безпосередньо у файлі. У разі глобального проекту (перед установкою або з глобальною залежністю) можна примусово встановити версію Composer за допомогою composer config -g platform.php 7.2.14
(перемикач -g
означає global
).
У деяких випадках ми хочемо встановити найновіші версії пакетів та ігнорувати налаштування локального середовища. У цьому випадку ми можемо скористатися розширеною командою:
$ composer update --ignore-platform-reqs
**Використовуйте перемикач ignore-platform-reqs
на свій страх і ризик, він може завдати шкоди проекту! Не використовуйте його, якщо не розумієте наслідків.
Composer - це фактично PHP-скрипт, загорнутий у так званий PHAR, який є скомпільованою версією PHP-додатку. Знання цієї інформації може бути використане з користю, наприклад, для кращого визначення параметрів самого виклику.
У дійсно великих проектах іноді трапляється так, що у нас закінчується оперативна пам'ять і потрібно виділяти набагато більше, або збільшувати час обробки скриптів.
Наприклад, в Windows для цього можна скористатися такою командою:
$ php -d memory_limit=-1 C:/xampp/htdocs/composer.phar update
Ключ memory_limit=-1
вказує Composer не зважати на обмеження оперативної пам'яті і використовувати стільки пам'яті, скільки йому потрібно.
Після запуску дій Composer можна викликати автоматичне виконання визначених користувачем скриптів, які або виконують певні дії над проектом, або, наприклад, генерують конфігурацію після розгортання. Я в основному використовую цей підхід на локальному сервері, щоб запропонувати інструмент автоматичної конфігурації бази даних, генерування схеми бази даних і так далі.
Прописуємо необхідні скрипти в розділі skripts
файлу composer.json
:
"scripts": {"post-autoload-dump": "Baraja\\PackageManager\\PackageRegistrator::composerPostAutoloadDump"}
При цьому автоматично викликається статичний метод composerPostAutoloadDump
в класі Baraja\PackageManager\PackageRegistrator
. Composer має цей клас, тому що він першим виконав генерацію класів автозавантажувачів.
Якщо ми хочемо просто запустити скрипти і не виконувати зайвих дій з Composer, то команда composer dump
дуже корисна, так як вона просто генерує новий автозавантажувач (який я рекомендую завжди тримати в актуальному стані), а потім відразу запускає скрипти. Якщо ви хочете спробувати використовувати скрипти, я підготував готовий пакет [Baraja PackageManager] (https://github.com/baraja-core/package-manager), який реалізує розумні скрипти та інтерактивний інтерфейс для фреймворку Nette.
Питання, яке ми часто обговорюємо з розробниками, полягає в тому, чи слід версіонувати вміст папки vendor
в Git'і, або ж генерувати її заново при кожній установці.
Загалом, більш чистим рішенням, здається, було б не версіонувати вміст взагалі і встановлювати все щоразу. Але реальність така, що час від часу розробник припиняє розробку пакета, або взагалі видаляє його. Постійне завантаження пакетів також ускладнює локальне встановлення та оновлення, а також уповільнює розгортання, а іноді може спричинити короткочасні перебої в роботі сайту, коли нові версії пакетів завантажуються некоректно.
Я розглядаю відсторонення Постачальника як форму "безпеки". Якщо файли фізично знаходяться в системі версій, ми маємо хоча б елементарну гарантію на виробничому сервері, що пакети будуть працювати і їх код точно такий же, як і в локально запущеній інсталяції. Крім того, Вендор часто займає лише одиниці мегабайт, що, безумовно, є гарантією працездатності сайту, враховуючи сьогоднішні обсяги дискового простору.
Практичне зауваження: Для середньостатистичного сайту, який я обслуговую, "вендор" займає не більше "30 МБ", що є прийнятною ємністю для Git'а. При клонуванні сховища за допомогою junior, нам не потрібно мати справу з навчанням його тому, як запустити сайт, і він просто "працює відразу".
Ви можете створювати власні пакунки у Composer, як загальнодоступні (зареєстровані на Packagist), так і приватні (ви повинні мати власний сервер пакунків, наприклад Satis).
Питання створення, супроводу, розвитку та версійності пакетів є дуже складним і буде темою окремої статті.
А поки що можете почитати статтю [Семантична версифікація] (https://semver.org/lang/cs/), яку я переклав для вас.
Jan Barášek Více o autorovi
Autor článku pracuje jako seniorní vývojář a software architekt v Praze. Navrhuje a spravuje velké webové aplikace, které znáte a používáte. Od roku 2009 nabral bohaté zkušenosti, které tímto webem předává dál.
Rád vám pomůžu:
Články píše Jan Barášek © 2009-2024 | Kontakt | Mapa webu
Status | Aktualizováno: ... | uk