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

    Введение


    В статье описан опыт развертывания девелоперской версии 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"
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 10

      0
      Добрый день!

      В связи с упоминаеним отдельных репозиториев у меня возник вопрос, вернее даже несколько вопросов на эту тему:
      • какая архитектура репозитория в вашем хранилище модулей, я себе представляю это так:
        /ModuleName/
            doc
            src/
                app
                skin
        
        если это так, то как вы мержите в этот репозиторий из девелоперской копии мадженто?
      • Перед тем как публиковать модуль в репозиторий у нас принято делать тесты для ЕЕ и СЕ платформ, деплой на эти платформы тоже не очень гладкий, поскольку опять стаёт проблема выковыривания файлов из дев. мадженты в ЕЕ и СЕ
      • у нас используется 4 репозитория (extension repository, developer repository, test ce, test ee) и применять модификации из дев мадженты на 3 остальных репозитория не очень удобно… (я использую патчи, но это всё равно не то что я хотел бы)
        Поделитесь пожалуйста опытом, как этот процесс происходит у вас?


      Спасибо.
        0
        Прошу прощения за задержку с ответом — Новый Год и все такое…

        На данный момент мы только рассматриваем возможность перехода на использование Magento Composer для развертывания наших проектов. Поэтому я не могу сказать, насколько удачно выбранное решение — нет опыта использования по полному циклу, от создания проекта, до его развертывания и внесения изменений. Что же касается предполагаемой структуры репозитория, то ее можно увидеть на github'е:


        Деплой на CE платформу описан в статье, к сожалению по поводу ЕЕ ничего не могу сказать — мы просто не сталкивались с таким вариантом. Похоже, что в репозитории нет такого модуля.

        По поводу развертывания проекта для различных задач (у нас это 4 варианта: девелоперская, тестовая, пилотная и production) я планирую написать отдельную статью. Когда доберусь до этого вопроса и разберусь в нем. Если доберусь и разберусь. Пока что только понятно, что стратегия развертывания для production-версии должна быть copy, а не symlink — т.е., там должен быть очень сильно другой composer.json.
          +1
          Нашел в интернетах, как создавать собственные пакеты с Magento Core — github.com/WeareJH/magento-skeleton/wiki/Creating-a-Core-Package Т.е., если нужно разворачивать свой модуль на EE-платформе, то создается соответствующий модуль, который и используется вместо
            "require": {
              ...
              "magento/core": "1.9.1.0",
              ...
            },
          
        0
        Наделся увидеть сравнение плюсов и минусов по сравнения с чистым modman.
          0
          К сожалению, с чистым modman'ом не работали. На данный момент мы разворачиваемся из SVN'а с использованием самописных shell-скриптов, монтируя узлы репозитория в дерево Magento-приложения на уровне каталогов.
            0
            Именно это делает modman. Даже из вашей статьи видно что плагин для композера использует конфиг модмана. Вот я и пытаюсь понять зачем кому то понадобилось делать modman 2.0 =) Только более сложный в использовании.
          0
          Как минимум, Magento Composer предполагает возможность развертывания под Windows, в то время, как modman сообщает:
          Windows (including cygwin) is not supported by this script, but there is a PHP-port of modman which works on Windows. I am not affiliated with the authors and do not provide support for the PHP port, only a link here for reference.


          Плюс, сам Composer является более универсальным инструментом (уровень PHP-сообщества), чем modman (уровень Magento-сообщества). Эти два пункта и побудили нас рассматривать Magento Composer вместо modman'а.
            0
            Magento не поддерживает Windows официально см. System Requirements for Magento, поэтому для скриптов поддержка Win не обязательна.
            0
            Я об этом не знал, поэтому до сих пор разрабатываю модули на рабочей станции под Win7 :) Да и последний production-сервер под Windows мы убрали буквально пару месяцев назад — мигрировали на linux'овый. Версия 1.9.0.1 CE вполне добротно стояла под wind'ой. Посмотрел системные требования — действительно, минимум с ноября 2013 года указана платформа Linux x86, x86-64. Ну мы, по крайней мере, не сталкивались с проблемами, вызванными тем, что Magento была развернута в win-среде. Там разворачивались одни из первых наших проектов (2-3 года назад), потом начали разворачивать на linux-серверах. Хотя разработка, как я уже отметил, идет на рабочих станциях под Windows.
              0
              Приятно видеть новые статьи, касаемые Magento. Тоже хочу написать, но пока не знаю что будет интересно аудитории.
              По теме, не вникал в тонкости, но думал уже насчет автоматизации рутиных действий, в том числе развертывания. Встречал утилиты mage-cli mage-tools, помогают, но не настолько насколько хотелось бы, возможно magento composer будет как раз кстати.

              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

              Самое читаемое