0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>Подавляющее большинство библиотек и проектов существуют не сами по себе. Типовые задачи имеют какие-то общие решения и вынесены в отдельные пакеты (какими-то разработчиками). Благодаря этим пакетам, разработчики экономят время, не делая то, что уже сделано до них. Подобных общих решений сотни тысяч. Вот лишь некоторые примеры:</p>
1
<p>Подавляющее большинство библиотек и проектов существуют не сами по себе. Типовые задачи имеют какие-то общие решения и вынесены в отдельные пакеты (какими-то разработчиками). Благодаря этим пакетам, разработчики экономят время, не делая то, что уже сделано до них. Подобных общих решений сотни тысяч. Вот лишь некоторые примеры:</p>
2
<ul><li>Библиотеки для выполнения HTTP-запросов</li>
2
<ul><li>Библиотеки для выполнения HTTP-запросов</li>
3
<li>Библиотеки для парсинга различных форматов - например, XML, JSON, YAML.</li>
3
<li>Библиотеки для парсинга различных форматов - например, XML, JSON, YAML.</li>
4
<li>Библиотеки обработки URL, которые позволяют извлекать из них части и собирать обратно</li>
4
<li>Библиотеки обработки URL, которые позволяют извлекать из них части и собирать обратно</li>
5
<li>Фейкеры - библиотеки для генерации адресов, имен и других случайных данных</li>
5
<li>Фейкеры - библиотеки для генерации адресов, имен и других случайных данных</li>
6
<li>Тестовые фреймворки. С их помощью код тестируется в автоматическом режиме (они используются во всех практиках на Хекслете)</li>
6
<li>Тестовые фреймворки. С их помощью код тестируется в автоматическом режиме (они используются во всех практиках на Хекслете)</li>
7
</ul><p>Любые из этих пакетов можно установить к себе в проект, используя Composer. Это одно из его главных предназначений.</p>
7
</ul><p>Любые из этих пакетов можно установить к себе в проект, используя Composer. Это одно из его главных предназначений.</p>
8
<p>Предположим, что наш пакет зависит от библиотеки<a>illuminate/collections</a>. Эту библиотеку мы будем активно использовать в наших курсах позже.</p>
8
<p>Предположим, что наш пакет зависит от библиотеки<a>illuminate/collections</a>. Эту библиотеку мы будем активно использовать в наших курсах позже.</p>
9
<p>Разберем процесс установки. Для начала нужно понять, под каким именем существует наша библиотека в Packagist. Здесь может быть два варианта:</p>
9
<p>Разберем процесс установки. Для начала нужно понять, под каким именем существует наша библиотека в Packagist. Здесь может быть два варианта:</p>
10
<ul><li>Либо мы уже знаем имя, как в случае<em>illuminate/collections</em></li>
10
<ul><li>Либо мы уже знаем имя, как в случае<em>illuminate/collections</em></li>
11
<li>Либо мы нашли библиотеку на GitHub и хотим выяснить ее имя</li>
11
<li>Либо мы нашли библиотеку на GitHub и хотим выяснить ее имя</li>
12
</ul><p>Часто имя можно извлечь из строки установки, которая есть в файле<em>README.md</em>:</p>
12
</ul><p>Часто имя можно извлечь из строки установки, которая есть в файле<em>README.md</em>:</p>
13
<p>Если ее нет, вы всегда можете узнать имя, открыв файл<em>composer.json</em>на GitHub и прочитав значение свойства<em>name</em>:</p>
13
<p>Если ее нет, вы всегда можете узнать имя, открыв файл<em>composer.json</em>на GitHub и прочитав значение свойства<em>name</em>:</p>
14
<p>Когда имя найдено, можно приступать к установке пакета. Для этого нужно перейти в директорию с нашим проектом и запустить там следующую команду:</p>
14
<p>Когда имя найдено, можно приступать к установке пакета. Для этого нужно перейти в директорию с нашим проектом и запустить там следующую команду:</p>
15
<p>Эта команда не только устанавливает зависимость в текущий проект, но и автоматически добавляет его в секцию<em>require</em>файла<em>composer.json</em>. Такая установка является локальной - в команде нет слова<em>global</em>. Другими словами, пакет ставится именно в текущий проект. Секция<em>require</em>теперь выглядит примерно так:</p>
15
<p>Эта команда не только устанавливает зависимость в текущий проект, но и автоматически добавляет его в секцию<em>require</em>файла<em>composer.json</em>. Такая установка является локальной - в команде нет слова<em>global</em>. Другими словами, пакет ставится именно в текущий проект. Секция<em>require</em>теперь выглядит примерно так:</p>
16
<p>Кроме того, Composer создаст файл<em>composer.lock</em>в корне проекта. Этот файл должен храниться в репозитории, а его значение мы изучим в следующем уроке.</p>
16
<p>Кроме того, Composer создаст файл<em>composer.lock</em>в корне проекта. Этот файл должен храниться в репозитории, а его значение мы изучим в следующем уроке.</p>
17
<p>Со временем все больше пакетов добавляется в текущий проект, и размер секции<em>require</em>становится все больше. В крупных проектах это могут быть сотни зависимостей. Посмотрим на пример, взятый из<a>php-package</a>:</p>
17
<p>Со временем все больше пакетов добавляется в текущий проект, и размер секции<em>require</em>становится все больше. В крупных проектах это могут быть сотни зависимостей. Посмотрим на пример, взятый из<a>php-package</a>:</p>
18
<p>У вас может возникнуть вопрос: "А куда помещается код этих пакетов?". Код пакетов, установленных локально, сохраняется в директории<em>vendor</em>, которую Composer автоматически создает во время установки пакетов. Эта директория находится в корне проекта:</p>
18
<p>У вас может возникнуть вопрос: "А куда помещается код этих пакетов?". Код пакетов, установленных локально, сохраняется в директории<em>vendor</em>, которую Composer автоматически создает во время установки пакетов. Эта директория находится в корне проекта:</p>
19
<p>Эта директория считается служебной, и программист никогда не работает с ней напрямую. Более того, она должна быть добавлена в<em>.gitignore</em>, потому что нет смысла хранить ее в репозитории. Composer создает ее самостоятельно.</p>
19
<p>Эта директория считается служебной, и программист никогда не работает с ней напрямую. Более того, она должна быть добавлена в<em>.gitignore</em>, потому что нет смысла хранить ее в репозитории. Composer создает ее самостоятельно.</p>
20
<p>Обычные зависимости нужны для работы пакета. Кроме них, существуют еще и специальные зависимости, необходимые только во время разработки. Такое разделение понадобилось в целях оптимизации.</p>
20
<p>Обычные зависимости нужны для работы пакета. Кроме них, существуют еще и специальные зависимости, необходимые только во время разработки. Такое разделение понадобилось в целях оптимизации.</p>
21
<p>Практически любой пакет во время разработки использует тестовый фреймворк, который нужен только для тестирования, а не для работы самого пакета. Поэтому нет смысла тащить его с собой в рабочее окружение. Это негативно влияет на размер пакета и на скорость его загрузки. Такие зависимости устанавливаются с помощью дополнительной опции<em>--dev</em>:</p>
21
<p>Практически любой пакет во время разработки использует тестовый фреймворк, который нужен только для тестирования, а не для работы самого пакета. Поэтому нет смысла тащить его с собой в рабочее окружение. Это негативно влияет на размер пакета и на скорость его загрузки. Такие зависимости устанавливаются с помощью дополнительной опции<em>--dev</em>:</p>
22
<p>В файле<em>composer.json</em>они появляются внутри секции<em>require-dev</em>:</p>
22
<p>В файле<em>composer.json</em>они появляются внутри секции<em>require-dev</em>:</p>
23
<p>Теперь самое интересное - как использовать установленные зависимости? В первую очередь, нужно смотреть документацию конкретной библиотеки на GitHub. Обычно там есть примеры или ссылка на описание. Например, в следующих уроках мы будем пользоваться библиотекой<a>illuminate/collections</a>. Она содержит десятки полезных функций для работы со строками. Изучим пример вызова:</p>
23
<p>Теперь самое интересное - как использовать установленные зависимости? В первую очередь, нужно смотреть документацию конкретной библиотеки на GitHub. Обычно там есть примеры или ссылка на описание. Например, в следующих уроках мы будем пользоваться библиотекой<a>illuminate/collections</a>. Она содержит десятки полезных функций для работы со строками. Изучим пример вызова:</p>
24
<h2>Установка с нуля</h2>
24
<h2>Установка с нуля</h2>
25
<p>После того как в проект устанавливаются зависимости, измененные файлы заливаются на GitHub. К ним относится как<em>composer.json</em>с добавленными в него описаниями зависимостей, так и файлы с исходным кодом, где эти зависимости используются. А вот директория<em>vendor</em>остается на локальной машине.</p>
25
<p>После того как в проект устанавливаются зависимости, измененные файлы заливаются на GitHub. К ним относится как<em>composer.json</em>с добавленными в него описаниями зависимостей, так и файлы с исходным кодом, где эти зависимости используются. А вот директория<em>vendor</em>остается на локальной машине.</p>
26
<p>Представьте, что с вами работает другой разработчик, который клонирует репозиторий и пытается запустить проект локально. Что произойдет? Запуск кода завершится с ошибкой. В проекте используются внешние библиотеки, но их физически нет. Директория<em>vendor</em>не создана.</p>
26
<p>Представьте, что с вами работает другой разработчик, который клонирует репозиторий и пытается запустить проект локально. Что произойдет? Запуск кода завершится с ошибкой. В проекте используются внешние библиотеки, но их физически нет. Директория<em>vendor</em>не создана.</p>
27
<p>Чтобы исправить это, сразу после клонирования нужно выполнить установку зависимостей. Для этого в Composer есть еще одна команда -<em>install</em>:</p>
27
<p>Чтобы исправить это, сразу после клонирования нужно выполнить установку зависимостей. Для этого в Composer есть еще одна команда -<em>install</em>:</p>
28
<p>Установка пакетов - это<a>идемпотентная</a>операция, ее можно запускать сколько угодно раз без риска что-либо поломать.</p>
28
<p>Установка пакетов - это<a>идемпотентная</a>операция, ее можно запускать сколько угодно раз без риска что-либо поломать.</p>
29
<p>Теперь самое интересное, как собственно использовать установленные зависимости? Ответ, как обычно находится в документации репозитория на гитхабе того пакета, который вы хотите использовать.</p>
29
<p>Теперь самое интересное, как собственно использовать установленные зависимости? Ответ, как обычно находится в документации репозитория на гитхабе того пакета, который вы хотите использовать.</p>
30
<p>Создайте в корне вашего проекта папку src, а внутри нее файл Runner.php. Добавьте следующий код:</p>
30
<p>Создайте в корне вашего проекта папку src, а внутри нее файл Runner.php. Добавьте следующий код:</p>
31
<p>К сожалению, на текущем этапе, код указанный выше, упадет в любом случае. Для его работы необходимо настроить автозагрузку, но об этом в следующем уроке.</p>
31
<p>К сожалению, на текущем этапе, код указанный выше, упадет в любом случае. Для его работы необходимо настроить автозагрузку, но об этом в следующем уроке.</p>
32
<p>Eсли вы склонировали репозиторий с гитхаба, папка vendor будет отсутствовать как и пакеты в ней. Первое, что нужно будет сделать, выполнить команду composer install. Установка пакетов - идемпотентная операция, ее можно запускать сколько угодно раз и все будет хорошо.</p>
32
<p>Eсли вы склонировали репозиторий с гитхаба, папка vendor будет отсутствовать как и пакеты в ней. Первое, что нужно будет сделать, выполнить команду composer install. Установка пакетов - идемпотентная операция, ее можно запускать сколько угодно раз и все будет хорошо.</p>