Квест → Как хакнуть форму
Прошли: 77
Все мы любим Composer. Он существенно изменил способ построения PHP приложений, основанных на небольших и повторно используемых компонентах, но это создает новые проблемы, особенно, когда у нас есть единая точка отказа. С помощью Satis, мы можем сделать процесс выкладки более устойчивым, добавив резервирование для всех потенциальных точек отказа (Packagist и GitHub). Давайте посмотрим, как это работает.
Нижеприведённая диаграмма показывает, как работает Composer при использовании Packagist в качестве центрального хранилища:

Если мы указываем, что хотим использовать различные репозитории, то Composer использует хранилище по умолчанию: Packagist. Composer запросит у Packagist информацию о всех пакетах, требуемых в файле composer.json, а также зависимостей, необходимых для этих пакетов.
Когда Composer получает всю информацию, он разрешает граф зависимостей, используя SAT solver и генерирует файл composer.lock с конкретными пакетами, которые должны быть установлены для того, чтобы выполнить требования, запрашиваемые в файле composer.json. Наконец, Composer загружает эти пакеты из различных источников: GitHub, Bitbucket, PEAR или любого GIT/SVN/Mercurial репозитория.
Данная архитектура имеет несколько проблем: что произойдет, если Packagist упадет? Это не будет работать. Composer не сможет разрешить граф зависимостей. В дополнение к этой проблеме, что произойдет, если необходимые пакеты размещаются в GitHub’е, и он в настоящее время не работает? Это не будет работать. Пакеты не будут загружены, что повлияет на вашу разработку и выкладку.
Как мы можем минимизировать все эти проблемы? Добавлением резервирования. Мы можем создать наш собственный репозиторий с помощью Satis, используя это хранилище вместо (или в дополнение к) Packagist. Следующая диаграмма показывает ту же схему, но с использованием специального хранилища:

Теперь, Composer запрашивает информацию о необходимых пакетах в нашем индивидуальном хранилище и будет обращаться к Packagist только том случае, если наш репозиторий не имеет этой информации. Мы даже можем отключить Packagist и настроить наш репозиторий, чтобы все зависимости пакетов загружались в него. Кроме того, наше хранилище может загрузить пакеты и действовать в качестве reverse proxy сервера. Таким образом, мы больше не зависим от GitHub’а для загрузки пакетов.
Мы можем установить Satis с помощью Composer:
$ composer create-project composer/satis --stability=dev
Давайте представим, что мы являемся компанией с несколькими разработчиками и для наших проектов нужно только две зависимости: Symfony HttpFoundation component и Twig. Мы хотим, чтобы у нас был индивидуальный репозиторий со всеми версиями (за исключением версий разработки) этих двух пакетов и мы не должны полагаться на GitHub:
{
"name": "ServerGrove repository",
"homepage": "http://149.5.47.251:8001",
"repositories": [
{
"type": "vcs",
"url": "git@github.com:symfony/HttpFoundation.git"
},
{
"type": "vcs",
"url": "git@github.com:twigphp/Twig.git"
}
],
"require-all": true,
"require-dependencies": true,
"archive": {
"directory": "dist",
"format": "tar",
"skip-dev": true
}
}
Формат файла довольно прост, но давайте посмотрим, что каждое из полей значит:
"name": имя хранилища."homepage": URL репозитория."repositories": содержит список репозиториев, которые мы хотим отразить."require-all": скачать все пакеты, а не только те, что с тегом."require-dependencies": если значение "true", Satis автоматически разрешает и добавляет все зависимости, поэтому Composer’у не нужно будет использовать Packagist."archive": "tar" файлы будут храниться в "dist" каталоге и нам не нужно будет загружать "dev" пакеты.Затем, мы говорим Satis создать хранилище:
$ ./bin/satis build satis.json servergrove-satis/
После этого, у нас есть новый каталог с названием servergrove-satis, который содержит два файла: packages.json и index.html. Первый является файлом конфигурации хранилища, который будет прочитан Composer’ом, чтобы определить, какие пакеты предлагает репозиторий. Файл index.html - просто статический HTML файл с информацией о хранилище. Он также содержит каталог dist со всеми пакетами, поэтому они не будут больше загружеаться с GitHub’а.
И, наконец, мы публикуем наш репозиторий с помощью PHP-шного встроенного сервера (для реальных хранилищ рекомендуется использовать Apache или Nginx):
$ php -S localhost:8001 -t servergrove-satis/
Теперь, если мы перейдем к http://localhost:8001, мы должны увидеть что-то вроде этого:

После того как репозиторий заработал, последним шагом нужно будет сообщить Composer’у, что мы хотим использовать его. Это может быть сделано путем добавления следующих строк в файл composer.json вашего проекта.
{
"repositories" : [
{"type" : "composer", "url" : "http://localhost:8001/"}
],
...
}
После этого, при запуске composer install будет использоваться наше хранилище:
$ composer install
Loading composer repositories with package information
Installing dependencies (including require-dev)
- Installing symfony/http-foundation (v2.6.6)
Downloading: 100%
Writing lock file
Generating autoload files
Мы видим в файле composer.lock, что URL-адрес на загрузку больше не указывает на GitHub, а на наш собственный репозиторий:
{
...
"packages": [
{
"name": "symfony/http-foundation",
"version": "v2.6.6",
"target-dir": "Symfony/Component/HttpFoundation",
"source": {
"type": "git",
"url": "https://github.com/symfony/HttpFoundation.git",
"reference": "8a6337233f08f7520de97f4ffd6f00e947d892f9"
},
"dist": {
"type": "tar",
"url": "http://localhost:8001/dist/symfony-http-foundation-8a6337233f08f7520de97f4ffd6f00e947d892f9-zip-3c2665.tar",
"reference": "8a6337233f08f7520de97f4ffd6f00e947d892f9",
"shasum": "04c8f9c294585c8fc982762f5181eab0083fdf3a"
}
}
...
}
Кроме того, мы можем увидеть запросы, которые делал Composer, чтобы получить сначала репозиторий (packages.json, включая /include/all$e0f2af5bfe26328fcc97241cbd95de682f4fbfaa.json), а затем сам пакет:
[Wed Apr 29 13:38:56 2015] x.x.x.x:64826 [200]: /packages.json [Wed Apr 29 13:38:56 2015] x.x.x.x:64827 [200]: /include/all$e0f2af5bfe26328fcc97241cbd95de682f4fbfaa.json [Wed Apr 29 13:39:13 2015] x.x.x.x:64839 [200]: /dist/symfony-http-foundation-8a6337233f08f7520de97f4ffd6f00e947d892f9-zip-3c2665.tar