Зависимости

В файле composer.json по умолчанию создаётся две секции: require и require-dev. Они предназначены для описания зависимостей проекта. Две секции понадобилось для разделения тех зависимостей, которые нужны при использовании библиотеки, и тех, которые нужны только для тестирования и локальной разработки. Например, тесты при использовании пакета совершенно ни к чему, они запускаются только во время разработки самого пакета, поэтому всё связанное с тестированием можно смело описывать в require-dev.

Предположим, что наш пакет зависит от библиотеки tightenco/collect. Эту библиотеку мы будем активно использовать в наших курсах позже. Разберём процесс установки:

  1. Для начала нужно понять, а под каким именем существует наша библиотека в Packagist. Тут вариантов два: либо мы уже знаем, как в случае tightenco/collect, либо мы загуглили библиотеку на GitHub и хотим выяснить её имя. Часто имя можно извлечь из строки установки, которая есть в файле README.md, но если её нет, вы всегда можете узнать имя, открыв файл composer.json и прочитав значение свойства name.

    {
        "name": "tightenco/collect",
        "description": "Collect - Illuminate Collections as a separate package.",
        "keywords": ["laravel", "collection"]
    }
    
  2. Теперь введём команду установки:

$ composer require tightenco/collect

Эта команда не только устанавливает зависимость в текущий проект, но и автоматически добавляет его в секцию require файла composer.json. Такая установка является локальной (в команде нет слова global), то есть пакет ставится именно в текущий проект. При таком подходе, зависимости ставятся в папку vendor, находящуюся в корне проекта. Не забудьте добавить эту папку в .gitignore, так как библиотеки не являются частью вашего репозитория и ставятся по необходимости после клонирования. Секция require теперь выглядит примерно так:

"require": {
    "tightenco/collect": "^5.7"
}

Кроме того, Composer создаст файл composer.lock в корне проекта. Этот файл должен храниться в репозитории, а его значение я объясню в следующем уроке.

Точно таким же способом ставятся последующие зависимости. Если зависимость должна оказаться в require-dev, то команда установки меняется так:

$ composer require --dev phpunit/phpunit

Теперь самое интересное — как, собственно, использовать установленные зависимости? Ответ, как обычно, находится в документации репозитория на GitHub того пакета, который вы хотите использовать.

Создайте в корне вашего проекта папку src, а внутри неё файл Runner.php. Добавьте следующий код:

<?php

namespace My\Project\Runner;

use Illuminate\Support\Collection;

function run()
{
    $collection = collect(['taylor', 'abigail', null])->map(function ($name) {
        return strtoupper($name);
    });

    return $collection;
}

Если попытаться вызвать эту функцию, то выполнение кода завершится с ошибкой. Это связано с тем, что необходимо настроить автозагрузку классов. Об этом в следующем уроке.

Если вы склонировали репозиторий с GitHub, папка vendor будет отсутствовать, как и пакеты в ней. Первое, что нужно будет сделать — выполнить команду composer install в директории проекта. Установка пакетов — это идемпотентная операция, её можно запускать сколько угодно раз без риска что-либо поломать.

Пакет

Всё, что описывалось выше для проекта, также применимо и для пакета. Единственное ключевое отличие — пакет нужно опубликовать, если вы хотите, чтобы другие люди могли им пользоваться. Для этого обязательно нужно изменить версию, указанную в composer.json, так как нельзя публиковать уже опубликованную версию. Ушедший код не может изменяться, ведь на него завязываются другие.

Для успешной публикации должны выполниться два условия:

  • Имя пакета уникально. Если оно не уникально, то пакет опубликован не будет.
  • Вы зарегистрированы на сайте https://packagist.org/

Далее следуйте указаниям на странице https://packagist.org/packages/submit. После того, как пакет будет опубликован, его можно устанавливать стандартным способом через вызов composer require.

Интересный вопрос заключается в том, как правильно версионировать пакет. На этот счёт был придуман стандарт, названный SEMVER. Его описание занимает буквально пару страниц на русском языке. Обязательно ознакомьтесь.

Самостоятельная работа

  • Зарегистрируйтесь на сайте https://packagist.org/ (это пригодится для участия в проектах)

Для продолжения нужно перейти в курс и вступить в него.