PHP: Настройка окружения
Теория: Управление зависимостями
Подавляющее большинство библиотек и проектов существуют не сами по себе. Типовые задачи имеют какие-то общие решения и вынесены в отдельные пакеты (какими-то разработчиками). Благодаря этим пакетам, разработчики экономят время, не делая то, что уже сделано до них. Подобных общих решений сотни тысяч. Вот лишь некоторые примеры:
- Библиотеки для выполнения HTTP-запросов
- Библиотеки для парсинга различных форматов — например, XML, JSON, YAML.
- Библиотеки обработки URL, которые позволяют извлекать из них части и собирать обратно
- Фейкеры — библиотеки для генерации адресов, имен и других случайных данных
- Тестовые фреймворки. С их помощью код тестируется в автоматическом режиме (они используются во всех практиках на Хекслете)
Любые из этих пакетов можно установить к себе в проект, используя Composer. Это одно из его главных предназначений.
Предположим, что наш пакет зависит от библиотеки illuminate/collections. Эту библиотеку мы будем активно использовать в наших курсах позже.
Разберем процесс установки. Для начала нужно понять, под каким именем существует наша библиотека в Packagist. Здесь может быть два варианта:
- Либо мы уже знаем имя, как в случае illuminate/collections
- Либо мы нашли библиотеку на GitHub и хотим выяснить ее имя
Часто имя можно извлечь из строки установки, которая есть в файле README.md:
Если ее нет, вы всегда можете узнать имя, открыв файл composer.json на GitHub и прочитав значение свойства name:
Когда имя найдено, можно приступать к установке пакета. Для этого нужно перейти в директорию с нашим проектом и запустить там следующую команду:
Эта команда не только устанавливает зависимость в текущий проект, но и автоматически добавляет его в секцию require файла composer.json. Такая установка является локальной — в команде нет слова global. Другими словами, пакет ставится именно в текущий проект. Секция require теперь выглядит примерно так:
Кроме того, Composer создаст файл composer.lock в корне проекта. Этот файл должен храниться в репозитории, а его значение мы изучим в следующем уроке.
Со временем все больше пакетов добавляется в текущий проект, и размер секции require становится все больше. В крупных проектах это могут быть сотни зависимостей. Посмотрим на пример, взятый из php-package:
У вас может возникнуть вопрос: «А куда помещается код этих пакетов?». Код пакетов, установленных локально, сохраняется в директории vendor, которую Composer автоматически создает во время установки пакетов. Эта директория находится в корне проекта:
Эта директория считается служебной, и программист никогда не работает с ней напрямую. Более того, она должна быть добавлена в .gitignore, потому что нет смысла хранить ее в репозитории. Composer создает ее самостоятельно.
Обычные зависимости нужны для работы пакета. Кроме них, существуют еще и специальные зависимости, необходимые только во время разработки. Такое разделение понадобилось в целях оптимизации.
Практически любой пакет во время разработки использует тестовый фреймворк, который нужен только для тестирования, а не для работы самого пакета. Поэтому нет смысла тащить его с собой в рабочее окружение. Это негативно влияет на размер пакета и на скорость его загрузки. Такие зависимости устанавливаются с помощью дополнительной опции --dev:
В файле composer.json они появляются внутри секции require-dev:
Теперь самое интересное — как использовать установленные зависимости? В первую очередь, нужно смотреть документацию конкретной библиотеки на GitHub. Обычно там есть примеры или ссылка на описание. Например, в следующих уроках мы будем пользоваться библиотекой illuminate/collections. Она содержит десятки полезных функций для работы со строками. Изучим пример вызова:
Установка с нуля
После того как в проект устанавливаются зависимости, измененные файлы заливаются на GitHub. К ним относится как composer.json с добавленными в него описаниями зависимостей, так и файлы с исходным кодом, где эти зависимости используются. А вот директория vendor остается на локальной машине.
Представьте, что с вами работает другой разработчик, который клонирует репозиторий и пытается запустить проект локально. Что произойдет? Запуск кода завершится с ошибкой. В проекте используются внешние библиотеки, но их физически нет. Директория vendor не создана.
Чтобы исправить это, сразу после клонирования нужно выполнить установку зависимостей. Для этого в Composer есть еще одна команда – install:
Установка пакетов — это идемпотентная операция, ее можно запускать сколько угодно раз без риска что-либо поломать.
Теперь самое интересное, как собственно использовать установленные зависимости? Ответ, как обычно находится в документации репозитория на гитхабе того пакета, который вы хотите использовать.
Создайте в корне вашего проекта папку src, а внутри нее файл Runner.php. Добавьте следующий код:
К сожалению, на текущем этапе, код указанный выше, упадет в любом случае. Для его работы необходимо настроить автозагрузку, но об этом в следующем уроке.
Eсли вы склонировали репозиторий с гитхаба, папка vendor будет отсутствовать как и пакеты в ней. Первое, что нужно будет сделать, выполнить команду composer install. Установка пакетов - идемпотентная операция, ее можно запускать сколько угодно раз и все будет хорошо.
.png)
