Введение
В статье описан опыт развертывания девелоперской версии Magento-приложения с использованием Magento Composer'а. Структура типового Magento-приложения в нашей компании:
- Magento
- Сторонние модули, используемые в проекте
- Разрабатываемые нами модули, используемые более, чем в одном нашем проекте
- Разрабатываемый нами модуль, содержащий функционал конкретно для данного проекта
- Тема для конкретного проекта
Девелоперская версия Magento-приложения должна позволять разрабатывать код наших модулей и заливать изменения в соответствующие репозитории, позволяя коду общих модулей мигрировать между проектами.
В связи с началом нового проекта для развертывания Magento-приложений решили попробовать Magento Composer. На данный момент у нас код каждого проекта хранится в своем SVN-репозитории, плюс в отдельном — все разрабатываемые нами модули (как общие, так и специализированные):
- инсталляция Magento и сторонние модули для проекта 01;
- инсталляция Magento и сторонние модули для проекта 02;
- ...
- наши модули;
Для использования Magento Composer'а проект разделили на следующие части (каждая в своем git-репозитории):
- z_mage_composer_prj_01_full: скрипты развертывания всего проекта, тема, сторонние модули, не доступные через Magento Composer;
- z_mage_composer_mod_01: первый модуль, от которого зависит проект;
- z_mage_composer_mod_02: второй модуль, от которого зависит проект;
Подготовка окружения
В процессе экспериментов выяснилось, что Windows плохо подходит для развертывания девелоперской версии приложения. Magento Composer предлагает две стратегии развертывания: copy (копирование файлов модулей в структуру Magento-приложения) и symlink (создание в структуре Magento-приложения символических ссылок на файлы модулей). Девелоперская версия может использовать только символические ссылки, т.к. нужно держать исходники модулей компактно в своих папках в каталоге vendor (место, в котором Composer размещает файлы используемых модулей). Символические ссылки в Windows отрабатывают недостаточно качественно — изменения, внесенные в оригинальный файл отражаются по ссылке с большой задержкой (как в IDE PhpStorm, так и на самом web-сервере). Плюс (вернее, минус) — используемый в Magento подход по нахождению шаблонов и описания layout'ов (каталог app/design/frontend/[default]/[default]) не работает в Windows (нужно модифицировать Mage_Core_Model_Design_Package::validateFile и Mage_Core_Block_Template::fetchView), но это уже скорее проблема на уровне PHP, чем на уровне Magento. Вообщем, после долгих попыток развернуть девелоперскую версию Windows была признана не самым удобным вариантом для разработки (хотя и возможным), поэтому для дальнейшего продолжения остался Linux (Ubuntu 14.04).
С установкой самого Composer'а проблем не возникло:
curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer
Все остальное (в том числе и установка Magento Composer'а) делается через настройку проекта в composer.json.
composer.json
Привожу только значимые в данном контексте настройки (полный вариант composer.json):
{
...
"type": "magento-module",
...
"require": {
"magento-hackathon/magento-composer-installer": "*",
"magento-hackathon/composer-command-integrator": "*@dev",
"composer/composer": "*@alpha",
"magento/core": "1.9.1.0",
"magento-hackathon/hackathon_magemonitoring": "*",
"connect20/nmmlm_log": "*",
"praxigento/z_mage_composer_mod_01": "*@dev",
"praxigento/z_mage_composer_mod_02": "*@dev"
},
"repositories": [
{
"type": "composer",
"url": "http://packages.firegento.com"
},
{
"type": "vcs",
"url": "https://github.com/praxigento/z_mage_composer_mod_01"
},
{
"type": "vcs",
"url": "https://github.com/praxigento/z_mage_composer_mod_02"
}
],
"extra": {
"magento-root-dir": "mage",
"magento-deploystrategy": "symlink",
"auto-append-gitignore": true
}
}
Секция require
- magento-hackathon/magento-composer-installer: непосредственно сам Magento Composer;
- magento-hackathon/composer-command-integrator: модуль для инкрементального обновления Magento-модулей по ходу разработки (для создания символических ссылок на новые файлы при добавлении файлов в модуле);
- composer/composer: необходим точный классификатор «alpha» для того, чтобы мог работать composer-command-integrator;
- magento/core: собственно код Magento;
- magento-hackathon/hackathon_magemonitoring: сторонний модуль, загружаемый из репозитория Magento Composer (для примера);
- connect20/nmmlm_log: модуль, свободно распространяемый через Magento Connect (подгружен из хранилища Magento Connect в хранилище Magento Composer)
- praxigento/z_mage_composer_mod_01: один наш собственный модуль, код которого находится в репозитории github'а;
- praxigento/z_mage_composer_mod_02: второй наш собственный модуль, код которого также находится в репозитории github'а;
Секция repositories
Замыкаем composer на репозиторий Magento-модулей:
{
"type": "composer",
"url": "http://packages.firegento.com"
}
… и указываем адреса репозиториев, где находятся наши собственные модули, используемые в проекте:
{
"type": "vcs",
"url": "https://github.com/praxigento/z_mage_composer_mod_01"
},
{
"type": "vcs",
"url": "https://github.com/praxigento/z_mage_composer_mod_02"
}
Секция extra
- magento-root-dir: задаем каталог, в котором будем разворачивать Magento (mage);
- magento-deploystrategy: задаем стратегию развертывания — symlink для девелоперской версии;
- auto-append-gitignore: указываем, что файлы Magento-модулей, которые будут линковаться в Magento-приложение (каталог mage), должны добавляться в файл mage/.gitignore для вывода из-под контроля версий;
Развертывание проекта
$ git clone git@github.com:praxigento/z_mage_composer_prj_01_full.git full
$ cd full
$ composer install
сообщения, выводимые на консоль
Loading composer repositories with package information
Installing dependencies (including require-dev)
- Installing justinrainbow/json-schema (dev-master 87b54b4)
Cloning 87b54b460febed69726c781ab67462084e97a105
- Installing icecave/isolator (2.3.0)
Loading from cache
- Installing eloquent/pops (3.1.1)
Loading from cache
- Installing eloquent/liberator (1.1.1)
Loading from cache
- Installing eloquent/enumeration (5.1.0)
Loading from cache
- Installing eloquent/composer-config-reader (2.0.0)
Loading from cache
- Installing magento-hackathon/magento-composer-installer (dev-master 38e6c01)
Cloning 38e6c01e6252fa408fbe63ef0b5b632b154f421b
- Installing symfony/console (2.7.x-dev b2d63b9)
Cloning b2d63b962688615d9b895a3d0be8bca7c3acf2fd
- Installing praxigento/z_mage_composer_mod_01 (dev-master 73ac1b0)
Cloning 73ac1b00c04eeb7037a5fb4bcea2502d06c588a0
- Installing praxigento/z_mage_composer_mod_02 (dev-master ae7f96c)
Cloning ae7f96cb757a971e95d23f4ce6141bb441315075
- Installing seld/jsonlint (1.3.0)
Downloading: 100%
- Installing symfony/process (2.7.x-dev 3131373)
Cloning 3131373c59f463709b04e39ae0818a2b84d01d38
- Installing symfony/finder (2.7.x-dev 3163e33)
Cloning 3163e335375f3433569996fd68c89887e4a82d29
- Installing composer/composer (dev-master 095dc61)
Cloning 095dc6129550de93cd98170c8e6c6ccd4558e983
- Installing magento-hackathon/composer-command-integrator (dev-master 826aa5a)
Cloning 826aa5a2a68d10d991b457c397b98773793f0f4c
- Installing magento/core (1.9.1.0)
Loading from cache
- Installing magento-hackathon/hackathon_magemonitoring (dev-master 393fd28)
Cloning 393fd2851597ed7e1a9ab87dae7f05feab455e3b
- Installing connect20/nmmlm_log (0.3.0)
Downloading: 100%
icecave/isolator suggests installing eloquent/asplode (Drop-in exception-based error handling.)
magento-hackathon/magento-composer-installer suggests installing colinmollenhour/modman (*)
magento-hackathon/magento-composer-installer suggests installing theseer/autoload (~1.14)
magento-hackathon/magento-composer-installer suggests installing zetacomponents/console-tools (dev-master)
symfony/console suggests installing symfony/event-dispatcher ()
symfony/console suggests installing psr/log (For using the console logger)
Writing lock file
Generating autoload files
В результате развертывания проекта исходные коды наших модулей попадают в каталог vendor (скрины взяты с локальной станции на Windows)
… линкуются в Magento-каталог mage:
… тема и модули, которые устанавливаются не через Magento Composer, заливаются прямо в каталог mage:
Точки монтирования различных репозиториев с исходными кодами:
В проекте два файла .gitignore:
- .gitignore: заполняется вручную разработчиками;
- mage/.gitignore: заполняется автоматически Magento Composer'ом при развертывании самой Magento и модулей;
Особенности разработки модулей
Все файлы модуля дожны быть прописаны в реестре mapping'а modman:
path/to/file/in/module path/to/file/in/magento
создать файл modman можно такой командой:
for i in `find . -type f | grep -v \.git | grep -v "^.$" | grep -v "modman" | sed 's/\.\///'`; do echo ${i} ${i}; done > modman
После добавления нового файла в модуль нужно запустить command integrator, чтобы новые файлы залинковались в корневой каталог Magento:
$ ./vendor/bin/composerCommandIntegrator.php magento-module-deploy
Чтобы модуль разворачивался в виде, пригодном для работы с системой контроля версий, в composer.json файле модуля нужно указать:
{
"name": "praxigento/z_mage_composer_mod_01",
...
"config": {
"preferred-install": "source"
}
}
При редактировании файла по ссылке в IDE (PhpStorm) наблюдается расхождение между «кажущимся» (mage/app/code/community/Vendor/Ext/Model/Observer.php) и «имеющимся» (vendor/company/module/app/code/community/Vendor/Ext/Model/Observer.php) — редактирование «имеющейся» версии с запозданием отражается в «кажущейся» (а функции Refresh в PhpStorm для этого дела не предусмотрено — приходится добавлять символ в «кажущуюся» версию, жать Ctrl + S и делать обновление через «Load File System Changes»). Breakpoints для отладки можно ставить в обоих версиях файла, но пошаговая трассировка идет только по «имеющейся» (иногда остановка возникает словно на пустом месте — это в «кажущейся» версии есть breakpoint на соответствующей строке).
Дополнительно
"Использование различных VCS репозиториев в PhpStorm"