четверг, 3 декабря 2015 г.

Yii + Composer = Yiicomposer

Composer

Composer (getcomposer.org) — это пакетный менеджер для PHP. И так что же представляет собой пакетный менеджер! Пакетный менеджер это набор программного обеспечения, позволяющего управлять процессом установки, удаления, настройки и обновления различных компонентов программного обеспечения. В нашем случае настраивать приложение без дополнительных плагинов Composer не будет! Про плагины и возможное расширение функционала Composer-а описывать не будем,этому возможно будет посвящена отдельная статья.

Для начала посоветую ознакомиться со следующими статьями:
1. Composer — менеджер зависимостей для PHP (http://habrahabr.ru/post/145946/)
2. Простое использование composer в Yii (http://tvorzasp.com/...composer-v-yii/)

И так в двух словах, что же можно делать при помощи Composer?
1. Скачивать пакеты и их зависимости
2. Скачивать пакеты, не только с packagist.org(официальный репозиторий), но и из любого git, mercurial, svn или стороннего репозитория (Можно даже организовать свой личный репозиторий!!!)
3. Работать с версиями, вышеперечисленных репозиториев.
4. Хранить пакет не только в каком-то из репозиториев, но и в простом zip архиве, на жёстком диске или на вашем личном сервере.
5. Произвольно оформлять пакет, без занесения его в какой-либо репозиторий строгого описании и т.д. и т.п. ну, в общем, свобода действия - нужна ссылка на архив, правильно описываем его в файле инструкций и всё готово!
6. Загружать пакеты одной командой - update (при первом запуске нужно выполнить install)

Давайте от сухой теории перейдём к практике.

Начнём!


Создаём папку (composer-test.com каждый может выбрать любое другое название по душе) под сайт, в директории Y:\home(это через виртуальный диск) или path/to/WebServers/home (это уже кому как нравится)
Создаём в папке composer-test.com текстовый файл composer.json – в данном файле мы и опишем все зависимости. Важно,- данный файл должен называться именно так!

Далее открываем (composer.json) в каком-то текстовом редакторе, у меня например это Notepad++
Пишем инструкции:


{
        "require": {  
                "yiisoft/yii": "1.1.14"
        } ,
        "config":{
                "vendor-dir": "www/protected/vendor"
        }
}


Сохраняем.

В двух словах, что мы сделали:
Запросили пакет "yiisoft/yii" версии "1.1.14", а также сконфигурировали установку, назначив папку для складывания всех пакетов параметра "vendor-dir" с путём "www/protected/vendor", данный путь будет относительно текущей директории(все пакеты будут размещены в папке path/to/WebServers/home/composer-test.com/www/protected/vendor).

Теперь пришло время запустить Composer!
Нажимаем Пуск->Выполнить Команду или нажмите Кнопку Windows + R
Пишем команду «cmd» и наживаем «Enter»

Перед вами открывается консоль
Теперь надо перейти к папке с проектом

cd /d full/path/to/composer-test.com
в моём случае это команда cd /d Y:\home\composer-test.com

атрибут /d – здесь установлен, так как происходит смена диска

Далее устанавливаем сам Composer (тут всё про установку http://getcomposer.org/download/)
Я просто скачиваю Composer в папку
php -r "eval('?>'.file_get_contents('https://getcomposer.org/installer'));"

у меня в консоли выдало следующее

Console said:
Y:\home\composer-test.com>php -r "eval('?>'.file_get_contents('https://getcompos
er.org/installer'));"
#!/usr/bin/env php
All settings correct for using Composer
Downloading...

Composer successfully installed to: Y:\home\composer-test.com\composer.phar
Use it: php composer.phar


Далее, если всё правильно установлено, выполняем команду
php composer.phar install

у меня в консоли выдало

Console said:
Y:\home\composer-test.com>php composer.phar install
Loading composer repositories with package information
Installing dependencies (including require-dev)
- Installing yiisoft/yii (1.1.14)
Loading from cache

Writing lock file
Generating autoload files


Смотрим, что же у нас получилось!!!

В папке Y:\home\composer-test.com появилась папка www/protected/vendor, в неё скачался наш первый пакет - "yiisoft/yii" ,который находится в папке -
Y:\home\composer-test.com/www/protected/vendor/yiisoft/yii.
Хочу обратить ваше внимание на то, что название пакета "yiisoft/yii" ("require": {"yiisoft/yii": "1.1.14"})
и название папки, в которую скачался пакет идентичны Y:\home\composer-test.com/www/protected/vendor/yiisoft/yii
ещё раз про структуру, потому что вам необходимо чётко понимать, где пакеты, чтобы лучше ориентироваться в коде

Y:\home\composer-test.com/ - папка в которой находится composer.phar
Y:\home\composer-test.com/www/protected/vendor/ - папка куда складываются все пакеты (по умолчанию /vendor/ но мы переустановили данную папку на "vendor-dir": "www/protected/vendor")
Y:\home\composer-test.com/www/protected/vendor/yiisoft/yii – папка в которую скачался пакет "yiisoft/yii"

Теперь давайте установим, например, yii-booster (http://yiibooster.clevertech.biz/) очень удобная вещь для построения бэкендов и работы с Bootstrap
Находим данное приложение в офф репозитории (https://packagist.or...ech/yii-booster)
Я решил поставить версию 2.0.0 значит надо добавить запись в require - "clevertech/yii-booster": "v2.0.0". итак наш файл composer.json будет выглядеть так:
{
        "require": {
                "yiisoft/yii": "1.1.14",
                "clevertech/yii-booster": "v2.0.0"
        },
        "config":{
                "vendor-dir": "www/protected/vendor"
    }
}


Далее набираем в консоли
php composer.phar update – именно update потому что install выполняется только первый раз

у меня в консоле

Console said:
Y:\home\composer-test.com>php composer.phar update
Loading composer repositories with package information
Updating dependencies (including require-dev)
- Installing clevertech/yii-booster (v2.0.0)
Loading from cache

Writing lock file
Generating autoload files


Теперь в папке Y:\home\composer-test.com/www/protected/vendor/
Находится уже два пакета:
Y:\home\composer-test.com/www/protected/vendor/yiisoft/yii
Y:\home\composer-test.com/www/protected/vendor/clevertech/yii-booster

Вывод
Composer - это очень удобное приложение для сборки инструментов или частей проекта, от вас требуется только правильно оформить файл composer.json

Фаил composer.json и Дополнительные возможности для разработки

Полное описание схемы формирования можно посмотреть тут http://getcomposer.o...oc/04-schema.md
Основные моменты с которыми вы будете сталкиваться при работе с файлом composer.json :
1) Работа со сторонними репозиториями
2) Работа с zip архивами
3) Наличие дополнительных удобств при разработке
4) Различие файла для пакета (создание своих библиотек) и проектного
5) Мелкие настройки

Работа со сторонними репозиториями и zip архивами
За настройку сторонних мест хранения пакетов отвечает параметр repositories в файле composer.json
Пример описания сторонних мест
{
    "repositories": [
        {
            "type": "vcs",
            "url": "https://github.com/some/package"
        },
        {
            "type": "package",
            "package": {
                "name": "smarty/smarty",
                "version": "3.1.7",
                "dist": {
                    "url": "http://www.smarty.net/files/Smarty-3.1.7.zip",
                    "type": "zip"
                }                
            }
        },
                {
            "type": "composer",
            "url": "http://packages.example.com"
        }
    ]
}


В данном примере показано три варианта указания мест хранения пакетов

1 вариант
{
        "type": "vcs",
        "url": "https://github.com/some/package"
}


Здесь описан пакет some/package расположенный на github.com
В пакете необходим файл composer.json с описанием пакета

2 вариант
{
        "type": "package",
        "package": {
                "name": "smarty/smarty",
                "version": "3.1.7",
                "dist": {
                        "url": "http://www.smarty.net/files/Smarty-3.1.7.zip",
                        "type": "zip"
                }                
        }
}


Здесь описан пакет в произвольной форме, находящийся в zip архиве ему дали название "smarty/smarty"("name": "smarty/smarty") установили версию "3.1.7" ("version": "3.1.7") и путь для скачивания архива("dist": {"url": "http://www.smarty.net/files/Smarty-3.1.7.zip","type": "zip"})

3 вариант
{
        "type": "composer",
        "url": "http://packages.example.com"
}


Ранее я говорил, что есть возможность создания своего личного репозитория, данная запись обозначит поиск пакетов в указанном репозитории.
Если пакет не найден ни в одном из указанных мест, то поиск будет продолжен в официальном репозитории.
Для отключения поиска в официальном репозитории необходимо добавить в список запись:
{
   "packagist": false
}


Пример:
{
        "repositories": [
                {
                        "packagist": false
                },
                {
                        "type": "composer",
                        "url": "http://packages.example.com"
                }
        ]
}


Хочу уточнить, что мы только обозначили места, откуда будут скачиваться пакеты, но пока мы их не добавим в раздел "require" пакеты не будут скачены.

Для того чтоб воспользоваться пакетами нам надо в раздел require добавить название пакета и версию.
Пример:
{
    "repositories": [
        {
            "type": "vcs",
            "url": "https://github.com/some/package"
        },
        {
            "type": "package",
            "package": {
                "name": "smarty/smarty",
                "version": "3.1.7",
                "dist": {
                    "url": "http://www.smarty.net/files/Smarty-3.1.7.zip",
                    "type": "zip"
                }                
            }
        }
    ],
        "require":{
                "some/package": "*",
                "smarty/smarty": "3.1.7",
        }       }


Наличие дополнительных удобств при разработке

Composer позволяет разделить процесс разработки пакета и его использования. При разработке обычно необходимы дополнительные инструменты для тестирования пакета.
Для этого в файле нужно описать переменную require-dev, данная переменная работает как и переменная require, только Composer ею пользуется, если вызвать установку с доп. параметром “--dev”
Консольная комманда выглядит так php composer.phar install --dev
Пример:
{
    "require": {
        "php": ">=5.3.0",
    },
    "require-dev": {
        "phpunit/phpunit": "3.7.*",
    }
}

В данном примере если вызвать установку с параметром –-dev, то в папку скачается доп. пакет phpunit/phpunit.

Различие файла для пакета (создание своих библиотек) и проектного файла

Пакетный файл
Одно обязательное поле "name"
"name": "some_nik/pack_name" – название состоит из двух частей разделённых слешем: первая часть обычно это ник пользователя, а вторая часть это уже выбранное разработчиком название пакета.

Остальные поля не обязательно, но часто используют следующие

"type": "library" – описать тип пакета, по умолчание library
Composer различает несколько типов я их не стану рассматривать, если захотите углубится, то материал тут http://getcomposer.o...-schema.md#type

"version": "1.0.0" – описать версию пакета

"license": "BSD-3-Clause" – описать лицензию пакета

"description": "text text text" – краткое описание пакета

"authors": [
{
"name": " name ",
"email": "email@some.com",
"homepage": "http://www.some.com "
}
] – в данном разделе можно перечислить авторов проекта

"require": {} – тут и так всё понятно


Проектный файл
В этом файле только требуется перечислить необходимые для сборки пакеты, то есть описать параметр require.
В официальной документации есть такое понятие как (root-only), это как раз относится только к данному файлу.
Вообще разницы между проектным и пакетным файлом нет. Надо понимать, что для разработчика пакет является проектом, а для тех, кто им пользуется пакетом. Для этого и была разработана логика root-only, так как некоторые переменные, такие как require-dev работают только из проектного файла.

Мелкие настройки
Параметры:
minimum-stability (root-only) – доступные значения dev, alpha, beta, RC, stable по умолчанию stable
config (root-only) – это блок параметров настроек. ниже будут перечислены часто используемые:
vendor-dir – указание пути паки для хранения пакетов
bin-dir - указание пути паки для хранения консольных команд
extra – это универсальный блок для хранения каких-то настроек используемых в дополнительных плагинах Composer

Итог по Copmoser-у
Удобен для быстрой сборки необходимых инструментов, не критичен к месту хранения пакетов, возможно лёгкое разделение работы, а также доп. возможности для разработчика.
Единственный минус - нет возможности воспользоваться им, если хостер не предоставил ssh, но можно собрать локально и выгрузить на сервер!!!

Я не упоминал в статье про автоматическую генерацию autoload.php файла, потому что это описано в других статьях и при использовании c Yii нет необходимости.

YiiComposer (https://packagist.or...dev/yiicomposer)

Острой необходимости в создании данного инсталлера не было, но у меня, как у разработчика работающего с Yii, есть привычки и желание оптимизировать и структурировать работу!

Первое от чего я стремился избавиться это длинные названия, допустим, есть пакет mihaildev/testextension то путь к данному пакету будет следующий

application.vendor.mihaildev.testextension.SomeExtension

Длинновато, не правда ли!

Поэтому я решил ввести свои типы, по умолчанию YiiComposer различает три типа extension, module, framework.

Для того чтоб YiiComposer распознал в пакете один из типов необходимо либо в описании пакета указать тип в формате yii-{type} или yii-{type}-{name} (пример "type": "yii-extension-test" {type} равен extension {name} равен test) либо в настройках путей указать для пакета тип и если необходимо переопределить имя.

Если правильно задать тип, то пакеты в свою очередь сформируют в папке vendor следующую структур:
Для yii-extension-name это vendor/extensions/name
Для yii-module-name это vendor/modules/name

Посудите сами, я не думаю, что вы будете использовать два различных модуля с одинаковым названием в одном проекте, а преимущество, которое предоставляет нововведение, это короткие и более читабельные алиасы.

Добавляем алиасы в список настроек:
'aliases'=>array(
'vmodule'=>'application.vendor.modules',
'vext'=>'application.vendor.extensions'
),

Теперь при установке mihaildev/testextension, у которого тип установлен yii-extension-test, путь выглядит так:

vext.test.SomeExtension

Сравните со старым вариантом:

application.vendor.mihaildev.testextension.SomeExtension

Мелочь, а приятно!!!

Настройка путей и свои типы
В разделе extra можно добавить блок yiicomposer-paths
Где можно переназначить стандартные типы или добавить новые, а также для пакетов, у которых не указан тип
Настройки по умолчанию, которые не обязательно указывать, но при необходимости можно переназначить
"extra":{
        "yiicomposer-paths":{
                "module": "{vendor}/modules/{name}",
                "extension": "{vendor}/extensions/{name}",
                "framework": "{vendor}/framework",
                "yiisoft/yii": "$framework$"                    
        }
}


Пути можно образовать несколькими способами

Составное формирование пути, основываясь на следующих переменных:

{vendor} – путь к папке для хранения всех пакетов берётся из основных настроек "vendor-dir"

{type} – тип пакета, если указан (пример yii-extension-test - {type} будет равен extension)
Тип пакета можно указать как в настройках пакета (в файле composer.json параметр "type" пакета) так и в настройках проектного файла в разделе "yiicomposer-paths" как для пакета yiisoft/yii установлен тип framework. Тип задаётся в нескольких форматах для параметра type в пакете yii-{type} или yii-{type}-{name} или в проектном файле в разделе "yiicomposer-paths" в формате ${type}$ или ${type}-{name}$
Если тип пакета задан но не описан в "yiicomposer-paths" то по умолчанию папка "{vendor}/{type}/{name}"

{package} – название пакета оригинальное (пример mihaildev/testextension будет равен mihaildev/testextension)

{name} – название по умолчанию берётся из названия пакета вторая часть (пример "name": "mihaildev/testmodule" {name} равен testmodule), если название установлено в типе пакета, то yiicomposer возьмёт его (пример yii-extension-test - {name} будет равен test) также можно переназначить и в настройках (пример "clevertech/yii-booster": "$extension-yii-booster$" {name} будет равен yii-booster)

Пример использования
{
    "minimum-stability" : "alpha",
    "config":{
        "vendor-dir": "www/protected/vendor"
    },    
     "require": {
                "mihaildev/yiicomposer": "dev-master",
                "mihaildev/testmodule": "dev-master",
                "mihaildev/testextension": "dev-master",
                "yiisoft/yii": "dev-master"
    }
}


Важно чтоб mihaildev/yiicomposer был первым в списке требуемых и был установлен первым!!! Иначе он не сработает.
При тестировании было замечено, что ,если один из пакетов был ранее закеширован, то появляется вероятность установки закешированных пакетов первыми, что приведет к ошибкам в путях.
В примере указан параметр "minimum-stability" : "alpha" потому что данный проект ещё открыт для изменений, я хочу получить окончательную критику и при необходимости доработать


Подстановка
Допустим у нас есть сторонняя библиотека "clevertech/yii-booster", у которой не описан тип.
Мы добавляем запись "clevertech/yii-booster": "$extension-yii-booster$"
Данная форма записи заполняет пробелы информации, которой не хватало для нормальной работы
"$extension-yii-booster$" – выделенная часть укажет, каким правилом надо воспользоваться для формирования пути
"$extension-yii-booster$" – выделенная часть будет использована в правиле как переменная {name},
что в свою очередь позволит получить адрес типа extension и сформирует путь path/to/vendor/extensions/yii-booster

Хочу сказать, что можно было бы сделать и такую запись "clevertech/yii-booster": "$extension$" так как {name} берётся изначально из второй части названия пакета ("clevertech/yii-booster" вторая часть yii-booster) то у нас получился абсолютно такой же результат.

Пример использования:
{
    "minimum-stability" : "alpha",
    "config":{
        "vendor-dir": "www/protected/vendor"
    }, 
        "extra":{
                        "yiicomposer-paths":{                           
                                "extension": "{vendor}/extensions/{name}",
                                "clevertech/yii-booster": "$extension-yii-booster$",
                                "yiiext/migrate-command": "$extension$"
                        }
        },      
     "require": {
                "mihaildev/yiicomposer": "dev-master",
                "mihaildev/testmodule": "dev-master",
                "mihaildev/testextension": "dev-master",
                "yiisoft/yii": "dev-master",
                "clevertech/yii-booster": "v2.0.0",
                "yiiext/migrate-command": "dev-master"
    }
}


Продумывая настройку путей, я старался упростить и увеличить гибкость использования.

Приведу несколько примеров использования

Точное назначение папки
{
    "minimum-stability" : "alpha",
    "config":{
        "vendor-dir": "www/protected/vendor"
    }, 
        "extra":{
                        "yiicomposer-paths":{                           
                                "yiiext/migrate-command": "www/protected/vendor/extensions/migrate-command"
                        }
        },      
     "require": {
                "mihaildev/yiicomposer": "dev-master",
                "mihaildev/testmodule": "dev-master",
                "mihaildev/testextension": "dev-master",
                "yiisoft/yii": "dev-master",
                "yiiext/migrate-command": "dev-master"
    }
}


Свои типы
{
    "minimum-stability" : "alpha",
    "config":{
        "vendor-dir": "www/protected/vendor"
    }, 
        "extra":{
                        "yiicomposer-paths":{                           
                                "sometype": "{vendor}/some/{name}"
                                "yiiext/migrate-command": "$sometype-hochutut$"
                                "mihaildev/testextension": "$sometype-hochutut2$"
                        }
        },      
     "require": {
                "mihaildev/yiicomposer": "dev-master",
                "mihaildev/testmodule": "dev-master",
                "mihaildev/testextension": "dev-master",
                "yiisoft/yii": "dev-master",
                "yiiext/migrate-command": "dev-master"
    }
}


В данном примере мы добавили тип "sometype",а также переопределили пути для пакетов,что приведёт к установке пакетов в папки:
yiiext/migrate-command в рath/to/vendor/some/hochutut и
mihaildev/testextension в рath/to/vendor/some/hochutut2

С управлением путей разобрались, перейдём ко второй части YiiComposer
Запуск консольных команд после обновления

В раздел scripts вносим следующую запись
"post-update-cmd": "YiiComposer\\Console::update"

Пример
{
    "minimum-stability" : "alpha",
    "config":{
        "vendor-dir": "www/protected/vendor"
    }, 
        "extra":{
                        "yiicomposer-paths":{
                                "clevertech/yii-booster": "$extension-yii-booster$",
                                "yiiext/migrate-command": "$extension$"
                        }
        },      
     "require": {
        "mihaildev/yiicomposer": "dev-master",
                "mihaildev/testmodule": "dev-master",
                "mihaildev/testextension": "dev-master",
                "yiisoft/yii": "dev-master",
                "clevertech/yii-booster": "v2.0.0",
                "yiiext/migrate-command": "dev-master"
    },
        "scripts":{
        "post-update-cmd": "YiiComposer\\Console::update"
    }
}


По умолчанию для запуска консольного приложения используется файл с настройками, находящийся по адресу path/to/vendor/../config/console.php,
так как я предполагаю, что пользователи будут хранить папку vendor в папке protected, но при необходимости можно установить пременную "yiicomposer-console-config" указав путь к файлу с настройками.

Пример:
{
    "minimum-stability" : "alpha",
    "config":{
        "vendor-dir": "www/protected/vendor"
    }, 
        "extra":{
                        "yiicomposer-console-config":"www/protected/config/console.php",

                        "yiicomposer-paths":{
                                "clevertech/yii-booster": "$extension-yii-booster$",
                                "yiiext/migrate-command": "$extension$"
                        }
        },      
     "require": {
        "mihaildev/yiicomposer": "dev-master",
                "mihaildev/testmodule": "dev-master",
                "mihaildev/testextension": "dev-master",
                "yiisoft/yii": "dev-master",
                "clevertech/yii-booster": "v2.0.0",
                "yiiext/migrate-command": "dev-master"
    },
        "scripts":{
        "post-update-cmd": "YiiComposer\\Console::update"
    }
}


По умолчанию выполняется только одна консольная команда yiic migrate
При необходимости можно добавить или переопределить список запускаемых команд настроив переменную "yiicomposer-console-commands"

Пример:
{
    "minimum-stability" : "alpha",
    "config":{
        "vendor-dir": "www/protected/vendor"
    }, 
        "extra":{
                        "yiicomposer-console-config":"www/protected/config/console.php",

                        "yiicomposer-console-commands":[
                                {
                                        "controller":"migrate"
                                },
                                {
                                        "controller":"test",
                                        "action": "test",
                                        "params": {
                                                "param1": "value1",
                                                "param2": "value2",
                                                "param3": "value3"
                                        }
                                }
                        ],

                        "yiicomposer-paths":{
                                "clevertech/yii-booster": "$extension-yii-booster$",
                                "yiiext/migrate-command": "$extension$"
                        }
        },      
     "require": {
        "mihaildev/yiicomposer": "dev-master",
                "mihaildev/testmodule": "dev-master",
                "mihaildev/testextension": "dev-master",
                "yiisoft/yii": "dev-master",
                "clevertech/yii-booster": "v2.0.0",
                "yiiext/migrate-command": "dev-master"
    },
        "scripts":{
        "post-update-cmd": "YiiComposer\\Console::update"
    }
}


Процесс:

Запускаем install (php composer.phar install)– при первом запуске консольные команды не запускаются я специально это сделал для того чтоб после сборки можно было проверить и настроить файл console.php (внести настройки БД и т.д.)

Запускаем update (php composer.phar update)– при втором запуске и последующих запусках консольные команды будут выполняться сразу после успешной сборки.

Ещё думаю проработать работу с языковыми пакетами!!!


В качестве примера использования, я собрал себе заготовку инструментов для создания проектов.
Рассчитан на работу с Денвером, но немного изменив можно и подо что угодно. https://github.com/M...-composer-blank

Как пользоваться заготовкой

Регистрируем на Денвере сайт допустим testproj.com (создаём папку у меня Y:\home\testproj.com)
Скачиваем архив распаковываем так чтоб фаил composer.json был в папке path/to/testproj.com (у меня Y:\home\testproj.com\composer.json)

В консоли переходим в папку Y:\home\testproj.com
Скачиваем туда composer.phar
Запускаем php composer.phar install

Что вы получите:

Главная страница
Страница контактов
Страница о нас
Бэкенд

Приложения

"mihaildev/elfinder" – (виджеты для работы с Файл менеджером http://elfinder.org/ подстраевается под работу с yii-booster)
"mihaildev/filesystem" – набор инструментов для работы с файлами
"mihaildev/backend" – приложение умеющее отделять бэкенд от фронтенда
"mihaildev/oneuser" – маленькое приложения для того чтоб не создавать пользовательский модуль то есть на сайте есть только один пользователь
"clevertech/yii-booster" - http://yiibooster.clevertech.biz/
"yiisoft/yii": "1.1.14" - Yii
"yiiext/migrate-command" – приложение для работы с модульными миграциями


В набор инструментов скоро войдёт приложение для работы с почтой и изображениями.

IT-записки

comments powered by Disqus