Квест → Как хакнуть форму
Прошли: 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