PHP Profi

Satis: Создайте свой собственный репозиторий Composer Перевод

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

Как работает Composer?

Нижеприведённая диаграмма показывает, как работает 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’у, что мы хотим использовать его. Это может быть сделано путем добавления следующих строк в файл 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

2015-05-27 оригинал

Последние посты

Комментарии

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