2. Composer
Composer (getcomposer.org) — менеджер
зависимостей для PHP.
В отличие от PEAR Composer устанавливает
зависимости не глобально для всего сервера, а
локально для конкретного проекта.
3. Как это работает
1. Есть проект, который зависит от нескольких библиотек.
2. Некоторые из этих библиотек зависят от других библиотек.
3. Вы описываете только те библиотеки, от которых
непосредственно зависит ваш код.
4. Composer находит нужные версии требуемых библиотек,
скачивает их и устанавливает в папку вашего проекта.
4. Где могут располагаться
зависимости?
• официальный репозиторий packagist.org
• git, mercurial или svn репозиторий
• можно скачать что угодно, лишь бы был url и доступ
5. Что нужно для начала работы?
• composer.phar
• composer.json
{
"require": {
"php":">=5.3.0",
"phpunit/phpunit":"3.7.*",
"twig/twig":">=1.8,<2.0-dev"
}
}
7. Но у нас есть проблема!
Composer устанавливает зависимости в /vendor/
8. Модуль битрикса в /vendor/
никому не нужен!
Что делать?
• composer/installers
• использовать плагин для Composer
9. Плагин для Composer
• https://getcomposer.org/doc/articles/custom-installers.md -
документация
• https://github.com/osotov/bitrix-composer-module-installer
- живой пример на основе документации
10. ModuleInstallerPlugin.php
<?php
namespace BitrixComposer;
use ComposerComposer;
use ComposerIOIOInterface;
use ComposerPluginPluginInterface;
class ModuleInstallerPlugin implements PluginInterface {
public function activate(Composer $composer, IOInterface $io)
{
$installer = new ModuleInstaller($io, $composer);
$composer->getInstallationManager()->addInstaller($installer);
}
}
11. ModuleInstaller.php
class ModuleInstaller extends LibraryInstaller
{
const PACKAGE_TYPE = 'bitrix-module-installer';
public function getPackageBasePath(PackageInterface $package)
{
$extras = $package->getExtra();
if ((array_key_exists('bitrix_module_name', $extras)) && (! empty($extras['bitrix_module_name']))) {
$name = (string) $extras['bitrix_module_name'];
} else {
throw new Exception(
'Unable to install module, composer.json must contain module name declaration like this: ' .
'"extra": { "bitrix_module_name": "somename" } '
);
}
return 'local/modules/' . $name;
}
}