В этом посте хочу немного рассказать об использовании менеджера зависимостей Composerв контексте модулей Битрикса. Composer позволяет легко установить нужные нам библиотеки, фреймворки и их зависимости в проект. Об установке Composer можно подробно прочитать на официальном сайте.
Представим, что у нас в наличии есть несколько собственных универсальных модулей, которые используются в проектах раз за разом. Изначально они переходят от проекта к проекту посредством копипаста. Через какое-то время приходит понимание, что копипаст - это плохо и не очень удобно. Мы принимаем волевое решение перенести их в репозиторий под управлением, например, Git. Стало лучше, не так ли? Нам не надо искать свои модули по проектам, выбирать наиболее актуальную версию. И все же остается небольшая проблема - для установки модулей следует пройтись по репозиториям и скачать их оттуда. Вот тут-то нам на помощь и приходит Composer! Но все не так просто, к сожалению. По умолчанию Composer устанавливает все зависимости в папку /vendor/, что не подходит нам в случае с модулями Битрикса. Как быть? Есть несколько решений:[spoiler]
Использовать универсальный плагин composer/installers для установки зависимостей в определенные директории проекта. Этот плагин поддерживает установку модулей и компонентов Битрикса.
В этом файле нет чего-либо особенного, он создан строго в соответствии с документацией.
Следующий файл более интересен. В нем расположен класс ModuleInstallerPlugin. Вот его содержимое:
<?php
namespace Bitrix\Composer;
use Composer\Composer;
use Composer\IO\IOInterface;
use Composer\Plugin\PluginInterface;
class ModuleInstallerPlugin implements PluginInterface {
public function activate(Composer $composer, IOInterface $io)
{
$installer = new ModuleInstaller($io, $composer);
$composer->getInstallationManager()->addInstaller($installer);
}
}
Его предназначение заключается в том, что мы добавляем свой тип установки зависимости. Этот тип установки описан классом ModuleInstaller, пример которого можно увидеть ниже:
<?php
namespace Bitrix\Composer;
use Composer\Package\PackageInterface;
use Composer\Installer\LibraryInstaller;
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;
}
public function supports($packageType)
{
return self::PACKAGE_TYPE === $packageType;
}
}
Что происходит тут? В первую очередь методом supports проверяется тип зависимости, которая использует наш плагин. В данном случае, если тип (type в composer.json) не совпадает со значением bitrix-module-installer, то кастомная установка не будет применена к зависимости. А в методе getPackageBasePath описана логика переопределения стандартной директории для установки (/vendor/). Как видно из кода, мы устанавливаем модуль в local/modules/$name, где $name - это директива bitrix_module_name, расположенная в блоке extra.
А теперь несколько слов о зависимости, которая будет использовать плагин, описанный выше. Ею будет являться не что иное, как модуль Битрикса, который расположен, например, в официальном репозитории зависимостей Composer. Файловая структура модуля стандартна, за исключением файла composer.json, описывающего нашу зависимость. Вот его пример:
Важные моменты были описаны выше, в описании плагина, но я повторюсь:
type - тип нашей зависимости. Если не указать корректный тип зависимости, кастомная установка зависимости не запустится.
extra/bitrix_module_name - название папки, в которую будет установлен наш модуль. В данном случае установка будет произведена в /local/modules/CustomProjectModule.
require - тут стандартно описаны названия всех зависимостей, которые мы хотим установить. В данном случае, конечно, указывается плагин для кастомной установки зависимости.
В заключение дам совет. Если вы, как и я используете Git, то делайте релизы с помощью git tag, это сэкономит вам кучу нервов!
Смотров Дмитрий, я пересмотрел свой ответ и теперь он такой - никак. Создатели Composer не собираются решать эту проблему. За разъяснением поведения Composer'a в этом случае следует обратиться сюда. P.S. А зачем вы задавали вопрос, если знали на него ответ?
Группы на сайте создаются не только сотрудниками «1С-Битрикс», но и партнерами компании. Поэтому мнения участников групп могут не совпадать с позицией компании «1С-Битрикс».