Осенью прошлого года, когда вышла Magento 2.0, я написал статью "Пример модуля для Magento 2", в которой обрисовал один из возможных вариантов формирования окружения для разработки модуля под вторую версию Magento. Совсем недавно вышли обновления (v 2.0.1 и v 2.0.2), судя по которым разработчики Magento уходят от схемы развертывания с использованием Magento Composer Installer (при помощи которого разворачивается Magento 1 и разворачивалась в моем предыдущем примере Magento 2.0.0), По крайней мере, простое изменение версии Magento c 2.0.0 на 2.0.1 приводило к тому, что то, что разворачивалось, работать как Magento-приложение совершенно не хотело.
Под катом — новый пример развертывания окружения, адаптированный под изменившиеся условия.
Задачи окружения
Пример содержит скрипты, предоставляющие возможность:
- Разворачивать среду локально для разработки Magento2-модуля;
- Разворачивать среду на сервисе Travis CI для тестирования Magento2-модуля;
Краткое содержимое
Описание основных каталогов и файлов flancer32/sample_mage2_module:
- /deploy/: файлы, использующиеся при развертывании;
- /composer_opts.json: опции для добавления в оригинальный composer.json Magento2 CE;
- /composer_unset.json: список ключей оригинального composer.json для удаления;
- /merge_json.php: утилита по слиянию основного JSON-файла Magento2 CE и дополнительных опций;
- /dev/fw/FuncTestApp.php: имплементация Magento2-приложения для запуска функциональных тестов;
- /src/: исходники самого Magento-модуля;
- /test/: тесты Magento-модуля;
- /functional/: функциональные тесты модуля (с подключением к БД);
- /unit/: unit-тесты модуля (все окружение mock'ируется');
- /work/: каталог развертывания среды для разработки и тестирования Magento-модуля;
- /.travis.yml: сценарий тестирования для Travis CI;
- /composer.json: composer.json для разрабатываемого модуля;
- /deploy.sh: сценарий развертывания;
- /deploy_cfg.sh.init: шаблон для задания конфигурационных параметров локальной развертки;
- /deploy_cfg.sh.travis: конфигурационные параметры для развертывания на Travis CI;
Общий алгоритм развертывания
- При помощи composer'а создаем Magento2 CE проект;
- Дополняем
composer.json
CE проекта нужными нам инструкциями; - При помощи composer'а обновляем проект;
- Запускаем инсталлятор самой Magento для инициализации базы данных;
- Выставляем права на каталоги и файлы;
Конфигурация
При развертывании конфигурация считывается из файла ./deploy_cfg.sh
(не находится под контролем версий по понятным причинам). Шаблон для создания конфигурационного локального файла содержит параметры двух типов:
- настройки magento-инсталлятора, запускающегося из командной строки в
deploy.sh
; - права на файловую систему Magento-приложения (владелец и группа);
Дополнительные опции composer.json
В дополнительных опциях к оригинальному Magento2 CE приложению добавляются:
- непосредственно сам разрабатываемый модуль;
- инструкция
autoload-dev
для использования имплементации Magento2-приложения для запуска функциональных тестов; - понижение минимальной стабильности composer-пакетов с
alpha
доdev
;
Слияние JSON-конфигураций
В данном примере считывание JSON-конфигурации и дальнейшая обработка ведется через универсальный контейнер данных (DataObject), что, по большому счету, излишне (см. ./deploy/merge_json.php
). Тем не менее, я использовал этот компонент, чтобы проверить возможность подключения при развертывании дополнительных зависимостей, используемых исключительно при развертывании. Вообщем, это можно выкинуть, если мешает. Помимо правок в merge_json.php
также нужно выкинуть из ./deploy.sh
строки
echo "nAdd initial dependencies to M2 CE project..."
composer require flancer32/php_data_object:dev-master
Перед слиянием удаляется элемент minimum-stability
в оригинальном composer.json
Magento2 CE (см. файл deploy/composer_unset.json
), т.к. в противном случае он будет содержать массив [ 'alpha', 'dev' ] вместо единичного значения 'dev'.
Инициализация приложения
Magento2-инсталлятор просто запускается из deploy.sh
:
php $M2_ROOT/bin/magento setup:install ...
Доступные для инициализации параметры.
Тестирование модуля
$ cd work/vendor
$ php ./bin/phpunit -c flancer32/sample_mage2_module/test/unit/phpunit.dist.xml
$ php ./bin/phpunit -c flancer32/sample_mage2_module/test/functional/phpunit.dist.xml
Лог Travis'а.
Дополнения
Version Control
Разработка модуля происходит не в каталоге ./src
, а в каталоге ./work/vendor/flancer32/sample_mage2_module/src
. Для того, чтобы IDE распознавало все модули, находящиеся в разработке, нужно их перечислить в соответствующих настройках (для PhpStorm это File / Settings / Version Control).
Secret key for Magento Connect
Для создания composer-проекта
$ composer create-project --repository-url=https://repo.magento.com/ magento/project-community-edition $M2_ROOT
нужно создать пару "ключей" на сайте Magento Connect. В случае развертывания вручную из командной строки composer сохраняет эти параметры в локальных настройках, в случае развертывания на Travis CI нужно задавать эти параметры в переменных окружения $M2_KEY_PUB & $M2_KEY_PRIV или прямо указать в .travis.yml
:
- composer config -g http-basic.repo.magento.com PUBLIC PRIVATE
Error: Maximum function nesting level of '100' reached
При возникновении данной ошибки нужно добавить в php.ini
:
xdebug.max_nesting_level=200
Phing
Phing ничего не предлагает для сборки Magento-проектов (да он и не должен, в общем-то). Поэтому вот так — shell & composer.
"Другимъ манеромъ"
Словосочетание взято из какой-то весьма старой поваренной книги, которая когда-то мне попалась на глаза.
Отскок от ответственности
Данный материал является просто примером и не может служить основой для развертывания реальных приложений без его осмысления.
Автор: flancer