«composer vs. копипаст модулей битрикса из проекта в...
DESCRIPTION
Автор: Михаил Осотов, веб-разработчик компании "Центр Высоких Технологий". Использование composer в контексте Битрикс.TRANSCRIPT
Composer vs. Копипаст модулей Битрикса из проекта в проект
Осотов Михаил
Composer
Composer (getcomposer.org) — менеджер зависимостей для PHP.
В отличие от PEAR Composer устанавливает зависимости не глобально для всего сервера, а локально для конкретного проекта.
Как это работает
1. Есть проект, который зависит от нескольких библиотек.2. Некоторые из этих библиотек зависят от других библиотек.3. Вы описываете только те библиотеки, от которых
непосредственно зависит ваш код.4. Composer находит нужные версии требуемых библиотек,
скачивает их и устанавливает в папку вашего проекта.
Где могут располагаться зависимости?• официальный репозиторий packagist.org• git, mercurial или svn репозиторий• можно скачать что угодно, лишь бы был url и доступ
Что нужно для начала работы?
• composer.phar• composer.json
{ "require": { "php":">=5.3.0", "phpunit/phpunit":"3.7.*", "twig/twig":">=1.8,<2.0-dev" }}
После установки получаем
• /vendor/• composer.lock
Но у нас есть проблема!
Composer устанавливает зависимости в /vendor/
Модуль битрикса в /vendor/ никому не нужен!
Что делать?• composer/installers• использовать плагин для Composer
Плагин для Composer
• https://getcomposer.org/doc/articles/custom-installers.md - документация
• https://github.com/osotov/bitrix-composer-module-installer - живой пример на основе документации
ModuleInstallerPlugin.php<?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.phpclass 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;
}
}
composer.json вашего модуля{
"name":"bitrix/bitrix_template_module",
"type": "bitrix-module-installer",
"description":"Bitrix custom project template module",
"license": "MIT",
"extra": {
"bitrix_module_name": "CustomProjectModule"
},
"require":{
"php":">=5.3.0",
"osotov/bitrix-module-installer-plugin": ">=1.0.0"
}
}
Небольшой совет
Делайте релизы!git tag вам в помощь
Что посмотреть?
• getcomposer.org• http://habrahabr.ru/post/145946/• https://github.com/composer/installers