Parser + Composer
n3o 21.11.2016 21:46
/ 21.11.2016 21:47
Всем привет.
У Парсера появился свой репозиторий пакетов:
https://pkg.parser.ruСделан он на базе стандартного репозитория PHP-пакетов
Packagist. Это означает, что теперь пакеты и их зависимости для Парсера можно устанавливать используя стандартный PHP-шный Composer.
Те, кто работал с PHP-проектами, скорее всего знают, что такое Composer, остальные могут ознакомиться с ним на официальном сайте
https://getcomposer.orgКак установить Composer.Для установки Composer, необходимо перейти в корневую директорию проекта (там где лежит или будет лежать
composer.json) и выполнить в командной строке:
curl -sS https://getcomposer.org/installer | php
или
wget -qO- https://getcomposer.org/installer | php
или скачать Composer по ссылке:
https://getcomposer.org/composer.pharБолее подробно про установку на разных платформах, или о том, как установить Composer глобально, можно почитать по ссылке:
https://getcomposer.org/doc/00-intro.mdЧтобы Composer начал устанавливать пакеты для Парсера, ему необходимо сказать о новом репозитории пакетов. Для того, чтобы это сделать, надо, либо в своём
composer.json добавить строчки:
"repositories": [
{"type": "composer", "url": "https://pkg.parser.ru"}
]
либо, добавить репозиторий в глобальные настройки Composer, выполнив команду:
php composer.phar config --global repositories.parser composer https://pkg.parser.ru
или, если Composer установлен глобально:
composer config --global repositories.parser composer https://pkg.parser.ru
После этого Composer будет искать запрашиваемые пакеты в том числе и на
https://pkg.parser.ruЧто, на счет автозагрузки классов как в PHP?Для того, чтобы использовать удобный автозагрузчик классов, необходимо в
composer.json своего проекта добавить плагин для Composer:
"require": {
"parser/autoload": "^1.0"
}
Этот плагин содержит в себе класс автозагрузчика для Парсера, а также автоматически генерирует файл:
autoload.p который регистрирует установленные пакеты. После этого достаточно в корневом
auto.p своего проекта, написать:
@USE
/path/to/vendor/autoload.p
и в проекте можно использовать установленные пакеты.
Автозагрузка и основные её принципы были заимствованы из Рекомендованных стандартов для PHP (
http://www.php-fig.org/psr/), в частности стандарт PSR-0 (уже depricated в php-проектах, но мы его поддерживаем в силу отсутствия в Парсере неймспейсов для классов) и PSR-4.
PSR-0 позволяет нам именовать классы следующим образом:
<Vendor name>_<Namespace(s)>_<Class name>
Например: Als_Config_Reader
Als_Config - это префикс/неймспейс, Reader - это название класса
PSR-4 позволяет нам именовать классы следующим образом:
<Vendor name>/<Namespace(s)/<Class name>
Например: Als/Config/Reader
Als/Config - это префикс/неймспейс, Reader - это название класса
Для регистрации префиксов и неймспейсов в автозагрузке используется секция “autoload”: {} в
composer.jsonПро неё можно почитать в официальной документации:
https://getcomposer.org/doc/04-schema.md#autoloadСейчас поддерживается: “PSR-0”, “PSR-4” и “files”
“PSR-0”, “PSR-4” - используются для регистрации префиксов/неймспесов в автозагрузчике, подключение файла с классом происходит только когда это необходимо, например, когда мы создаем объект класса.
“files” - используется, чтобы подключать файлы из пакета непосредственно в момент загрузки. Использование можно посмотреть, например в пакете:
als/debugНапример, если в composer.json указать:
"require-dev": {
"als/debug": "^1.0"
}
то, Composer установит пакет als/debug и автоматически подключит его.
Надо учесть, что Composer предназначен для PHP классов, поэтому при регистрации PSR-4 префиксов и неймспейсов надо учитывать, что там в качестве разделителя используются обратный слеш ‘\’. Так же, Composer почему-то требует, чтобы префикс или неймспейс в секции “autoload” заканчивался разделителем, для PSR-0 это подчеркивание ‘_’, для PSR-4 это слэш ‘\’.
Пример: Допустим нам в проекте надо подключить два пакета (als/test1 и als/test2), для примера один из них написан по стандарту PSR-0, второй по стандарту PSR-4.
Первый пакет:
{
"name": "als/test1",
"autoload": {
"psr-0": {
"Als_Test1_": "src/"
}
}
}
Второй пакет:
{
"name": "als/test2",
"autoload": {
"psr-4": {
"Als\\Test1\\": "src/"
}
}
}
В файле composer.json своего проекта, мы пишем:
"require": {
"als/test1": "^1.0",
"als/test2": "^1.0"
}
(про версии можно почитать в официальной документации:
https://getcomposer.org/doc/articles/versions.md)
И выполняем команду:
php composer.phar install
После этого Composer устанавливает наши зависимости (по-умолчанию в папку /vendor/) и генерирует файл
autoload.pДалее, мы в корневом auto.p своего проекта, подключаем автозагрузчик:
@USE
/vendor/autoload.p
И далее в любом месте своего проекта, мы можем использовать подключенные библиотеки:
$test1[^Als_Test1_MyClass::create[]]
$test2[^Als/Test2/MyClass::create[]]
Как написать свой пакет.Достаточно в папку со своим пакетом положить файл composer.json с минимальным его содержимым, опубликовать пакет, например, в GitHub и добавить ссылку на репозиторий с пакетов тут:
https://pkg.parser.ru/packages/submitЧто, сейчас есть на https://pkg.parser.ru/В данный момент в репозиторий переносятся классы и библиотеки опубликованные в разделе “
Библиотека”
Некоторые из них уже перенесены, например
als/sql и
als/debug, некоторые готовятся к переносу.
Следующим шагом, будет рефакторинг этих библиотек. Например, вынос какого-то функционала в отдельные пакеты, и подключение их в качестве зависимостей.
Все вопросы про именования классов, автозагрузку, структуру пакетов, как и где autoload ищет файлы, про класс Parser/Autoload можно задавать тут, постараюсь оперативно отвечать.
- Parser + Composer, n3o 21.11.2016 21:46 / 21.11.2016 21:47