Pull to refresh

Разработка Magento-модулей с развертыванием приложения через Magento Composer

Reading time 7 min
Views 10K

Введение


В статье описан опыт развертывания девелоперской версии 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"
Tags:
Hubs:
+1
Comments 10
Comments Comments 10

Articles