Composer – это популярный менеджер зависимостей для PHP, который упрощает процесс установки и обновления зависимостей вашего проекта. Composer проверяет, от каких пакетов зависит проект, а затем устанавливает все необходимые версии согласно требованиям.
Также Composer часто используется для запуска нового проекта на основе популярных PHP-фреймворков типа Symfony или Laravel.
Данный мануал поможет установить и начать работу с Composer на сервере Ubuntu 20.04.
Требования
Для работы вам понадобится сервер Ubuntu 20.04, предварительно настроенный по этому мануалу. Чтобы приступить, войдите в сессию своего пользователя sudo.
1: Установка PHP и других зависимостей Composer
Прежде чем начать установку Composer, нужно установить все зависимости программы. Часть из них установлена на вашем сервере по умолчанию (например, git и curl). Еще Composer нужен пакет php-cli для запуска скриптов PHP из командной строки и unzip для распаковки архивов.
Сначала обновите индекс пакетов:
sudo apt update
Все необходимые пакеты можно установить при помощи команды:
sudo apt install php-cli unzip
Чтобы подтвердить установку, нажмите Y и ENTER.
2: Загрузка и установка Composer
Composer предоставляет написанный на PHP инсталлятор. Его нужно загрузить и убедиться в целостности пакета.
Перейдите в домашний каталог и извлеките инсталлятор при помощи curl:
cd ~
curl -sS https://getcomposer.org/installer -o composer-setup.php
Запустите скрипт PHP, чтобы убедиться, что хэш SHA-384 пакета совпадает с хэшем инсталлятора, указанным на этой странице. Чтобы упростить этап проверки, вы можете использовать следующую команду, она извлечет последний хеш со страницы Composer и сохранит его в переменной оболочки:
HASH=`curl -sS https://composer.github.io/installer.sig`
Чтобы проверить полученное значение, введите:
echo $HASH
e0012edf3e80b6978849f5eff0d4b4e4c79ff1609dd1e613307e16318854d24ae64f26d17af3ef0bf7cfb710ca74755a
А затем запустите скрипт PHP, который подтвердит подлинность и надежность загруженного инсталлятора (как рекомендует сайт Composer):
php -r "if (hash_file('SHA384', 'composer-setup.php') === '$HASH') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
Если значения совпали, команда вернёт:
Installer verified
Если команда вернула Installer corrupt, загрузите скрипт снова и повторите проверку. Когда хэш совпадет, вы сможете продолжить работу.
Чтобы выполнить глобальную установку composer, введите эту команду. Эта команда загрузит пакет менеджера Composer и выполнит его глобальную установку в /usr/local/bin, после чего в системе появится общедоступная команда composer.
sudo php composer-setup.php --install-dir=/usr/local/bin --filename=composer
Вы получите такой вывод:
All settings correct for using Composer
Downloading...
Composer (version 1.10.5) successfully installed to: /usr/local/bin/composer
Use it: php /usr/local/bin/composer
Чтобы убедиться в том, что установка прошла успешно, запустите команду:
composer
Она должна вернуть:
. ______
. / ____/___ ____ ___ ____ ____ ________ _____
./ / / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__ ) __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
. /_/
Composer version 1.10.5 2020-04-10 11:44:22
Usage:
command [options] [arguments]
Options:
-h, --help Display this help message
-q, --quiet Do not output any message
-V, --version Display this application version
--ansi Force ANSI output
--no-ansi Disable ANSI output
-n, --no-interaction Do not ask any interactive question
--profile Display timing and memory usage information
--no-plugins Whether to disable plugins.
-d, --working-dir=WORKING-DIR If specified, use the given directory as working directory.
--no-cache Prevent use of the cache
-v|vv|vvv, --verbose Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
...
Это значит, что менеджер зависимостей Composer был успешно установлен.
Примечание: Также менеджер Composer можно установить индивидуально для каждого отдельного проекта. Локальный вариант установки особенно хорош в том случае, если пользователь не имеет права выполнять общесистемную установку программы. Чтобы установить Composer локально, загрузите пакет и проверьте его подлинность (как показано выше), а затем запустите:
php composer-setup.php
Команда сгенерирует файл composer.phar в локальном каталоге. Его можно запустить с помощью команды:
php composer.phar
3: Использование Composer в проекте PHP
Проекты PHP часто зависят от внешних библиотек, управлять зависимостями и версиями которых бывает непросто. Composer может упростить отслеживание, обновление и установку новых версий и зависимостей.
Чтобы интегрировать Composer в свой проект, вам нужен файл composer.json. Он содержит информацию о зависимостях, которые должен скачать Composer для определённого проекта. Он позволяет задать необходимые версии зависимостей и исключить их нестабильные и потенциально опасные версии.
Этот файл не рекомендуется создавать вручную, поскольку при этом можно допустить ошибку в синтаксисе. Composer автоматически создаст файл composer.json после того, как вы добавите первую зависимость при помощи команды require (это очень удобно, если вы хотите поделиться своим файлом на Packagist). Остальные зависимости можно добавить с помощью этой же команды require, и при этом нет необходимости вручную редактировать файл.
Процесс установки зависимостей проекта при помощи Composer состоит из следующих этапов:
- Определение необходимых приложению библиотек.
- Поиск подходящей открытой библиотеки в Packagist.org, официальном репозитории Composer.
- Выбор зависимостей.
- Запуск команды composer require, которая добавляет зависимости в файл composer.json и устанавливает пакеты.
Рассмотрим этот процесс на примере простого приложения.
Цель этого приложения – превратить заданное предложение в «понятный» URL (или slug); как правило, это приложение используется для преобразования названий страниц в URL-адреса (к примеру, обратите внимание на последний сегмент URL-адреса этого урока).
Итак, создайте каталог проекта; для примера назовём его slugify:
cd ~
mkdir slugify
cd slugify
Хотя это и не обязательно, сейчас вы можете запустить команду composer init, чтобы создать подробный файл composer.json для вашего проекта. Поскольку единственной целью нашего проекта является демонстрация установки зависимостей с помощью Composer, мы будем использовать более простой файл composer.json, который будет сгенерирован автоматически.
Теперь попробуйте найти пакет, генерирующий slug-адреса, в репозитории Packagist.org. Просто введите в поле поиска запрос slug.
Справа возле каждого результата поиска можно увидеть два счётчика. Первый показывает, сколько раз пакет был установлен; второй счётчик показывает, сколько раз пакет был отмечен на GitHub. Результат поиска можно переупорядочить согласно показателю одного из счётчиков. Конечно, пакеты с большим показателем счётчиков, как правило, более стабильны, так как они чаще используются. Также важно проверить описание пакета – действительно ли это нужный пакет?
Сейчас нам нужно найти простой конвертёр адресов. В мануале мы используем пакет cocur/slugify, первый в выдаче.
Обратите внимание: Packagist указывает имя вендора и имя пакета (vendor name и package name). Каждому пакету присваивается уникальный идентификатор, или пространство имён (в том же формате, что и для репозиториев Github: vendor/package). Необходимый пакет называется cocur/slugify. Чтобы загрузить пакет автоматически, нужно указать менеджеру зависимостей пространство имён пакета.
Итак, теперь вам известно точное имя пакета. Используйте команду composer require, чтобы добавить этот пакет в файл composer.json.
При запросе пакетов важно отметить, что Composer отслеживает зависимости как уровня приложения, так и уровня системы. Зависимости системного уровня важны для определения PHP модулей, на которых основан пакет. В случае пакета cocur/slugify требуется модуль PHP, который мы еще не установили.
Если необходимый пакет основан на системной библиотеке, которая еще не установлена в системе, вы получите ошибку:
composer require cocur/slugify
Using version ^4.0 for cocur/slugify
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Your requirements could not be resolved to an installable set of packages.
Problem 1
- Installation request for cocur/slugify ^4.0 -> satisfiable by cocur/slugify[v4.0.0].
- cocur/slugify v4.0.0 requires ext-mbstring * -> the requested PHP extension mbstring is missing from your system.
...
Чтобы устранить эту ошибку, нужно найти недостающий пакет:
apt search mbstring
Sorting... Done
Full Text Search... Done
php-mbstring/focal 2:7.4+75 all
MBSTRING module for PHP [default]
php-patchwork-utf8/focal 1.3.1-1 all
UTF-8 strings handling for PHP
php7.4-mbstring/focal 7.4.3-4ubuntu1 amd64
MBSTRING module for PHP
Узнав точное имя пакета, установите его с помощью пакетного менеджера apt:
sudo apt install php-mbstring
После этого можно снова запустить composer require:
composer require cocur/slugify
Using version ^4.0 for cocur/slugify
./composer.json has been created
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 1 install, 0 updates, 0 removals
- Installing cocur/slugify (v4.0.0): Downloading (100%)
Writing lock file
Generating autoload files
Как видите, Composer автоматически определяет необходимую версию пакета. Проверьте каталог проекта, теперь он содержит два файла (composer.json и composer.lock) и каталог vendor:
ls -l
total 12
-rw-rw-r-- 1 8host 8host 59 May 4 13:56 composer.json
-rw-rw-r-- 1 8host 8host 3229 May 4 13:56 composer.lock
drwxrwxr-x 4 8host 8host 4096 May 4 13:56 vendor
Файл composer.lock используется для хранения данных о версиях установленных пакетов и обеспечивает использование одинаковых версий пакетов в случае клонирования проекта. Каталог vendor содержит зависимости проекта. В случае использования контроля версий не отправляйте сообщения о коммитах каталога vendor; это применимо только для файлов composer.json и composer.lock.
Примечание: При установке проекта, который уже содержит файл composer.json, используйте следующую команду, чтобы установить зависимости проекта:
composer install
Теперь давайте посмотрим на ограничения версий. Файл composer.json содержит примерно такой код:
cat composer.json
{
"require": {
"cocur/slugify": "^4.0"
}
}
Обратите внимание на знак вставки (^) перед номером версии. Для определения версии пакета Composer может использовать несколько типов ограничений и форматов; эта функция позволяет следить за стабильностью проекта. Оператор ^ используется в файле composer.json для максимальной совместимости версий. В данном случае он определяет версию 4.0 как минимальную и разрешает обновления до версии 5.0.
В целом, вам не придётся особенно долго возиться с ограничениями версий в файле composer.json. Однако в некоторых ситуациях может потребоваться отредактировать ограничения вручную (например, если вышла новая версия библиотеки, но composer.json не разрешает обновиться до неё).
Эта таблица поможет разобраться в том, как работают ограничения версий Composer:
Ограничение | Значение |
^1.0 | >= 1.0 < 2.0 |
^1.1.0 | >= 1.1.0 < 2.0 |
~1.0 | >= 1.0 < 2.0.0 |
~1.0.0 | >= 1.0.0 < 1.1 |
1.2.1 | 1.2.1 |
1.* | >= 1.0 < 2.0 |
1.2.* | >= 1.2 < 1.3 |
Подробнее об ограничениях версий можно прочесть в документации программы.
4: Сценарий автозагрузки
Также Composer использует сценарий autoload, который можно добавить в проект для поддержки автозагрузки. Он упрощает работу с зависимостями и определяет собственные пространства имен.
Вам нужно просто добавить файл vendor/autoload.php в скрипты PHP перед установкой класса.
Вернёмся к тестовому приложению slugify. Создайте скрипт test.php и задайте в нём библиотеку cocur/slugify:
nano test.php
Добавьте в файл код, который запустит vendor/autoload.php, загрузит зависимость cocur/slugify и использует ее для преобразования текста.
<?php
require __DIR__ . '/vendor/autoload.php';
use Cocur\Slugify\Slugify;
$slugify = new Slugify();
echo $slugify->slugify('Hello World, this is a long sentence and I need to make a slug from it!');
Сохраните и закройте файл.
Запустите сценарий:
php test.php
Он выдаст:
hello-world-this-is-a-long-sentence-and-i-need-to-make-a-slug-from-it
5: Обновление зависимостей проекта
Чтобы обновить зависимости проекта, используйте команду update:
composer update
Она проверит наличие новых версий тех пакетов, от которых зависит ваш проект. Обнаружив новую версию, которая разрешена ограничениями, менеджер зависимостей установит её вместо устаревшей версии данного пакета. Все изменения будут внесены в файл composer.lock.
Можно также обновить несколько определённых библиотек одновременно:
composer update vendor/package vendor2/package2
После обновления проверьте файлы composer.json и composer.lock.
Заключение
Composer – очень мощный инструмент, необходимый каждому разработчику PHP.
Это надежный способ обнаружения, установки и своевременного обновления пакетов PHP, от которых зависит проект. Теперь вы умеете устанавливать Composer, добавлять новые зависимости в проект и обновлять их после появления новых версий.