Пример модуля для Magento 2 другимъ манеромъ

Осенью прошлого года, когда вышла 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-приложение совершенно не хотело.

Под катом — новый пример развертывания окружения, адаптированный под изменившиеся условия.

Задачи окружения


Пример содержит скрипты, предоставляющие возможность:

  1. Разворачивать среду локально для разработки Magento2-модуля;
  2. Разворачивать среду на сервисе 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.

«Другимъ манеромъ»


Словосочетание взято из какой-то весьма старой поваренной книги, которая когда-то мне попалась на глаза.

Отскок от ответственности


Данный материал является просто примером и не может служить основой для развертывания реальных приложений без его осмысления.

© Habrahabr.ru