- PVSM.RU - https://www.pvsm.ru -
Используя современный подход к разработке проектов начинаэшь пользоваться прелестями менеджера пакетов, в случаe с разработкой на PHP это Composer. В данной статье мы кратко рассмотрим Composer и далее речь пойдёт о настройке локального кэша пакетов.
Данное описание ни в коем случае не претендует на полноту, а лишь даёт краткое представление о данном инструменте.
В прочем Composer не ограничен Packagist хранилищем и вполне позволяет настроить зависимые пакеты из svn, git, pear. Пакеты должны содержать правильно настроенный конфигурационный файл (composer.json). Хотя и это не обязательно, если конфигурационный файл отсутствует в нужном вам пакете, то вам самим придётся его прописать уже в конфигурационном файле зависимостей вашего проекта. Пример [3]
Конфигурация зависимостей проекта происходит через Json конфигурационный файл (composer.json). Суть сводится к нахождению нужного пакета на Packagist, добавления соответствующей записи в composer.json и запуска Composer, который сам скачает и настроит пакет (настроит по мере прописанных действий разработчиком пакета). Пример [4].
Посмотрим пример минимальной установки фреймворка Silex [5] на (debian/ubuntu):
mkdir /path/to/your/webroot/silex; cd /path/to/your/webroot/silex
sudo apt-get install git,php5,curl; curl -sS https://getcomposer.org/installer | php
Этой командой вы скачаете Composer в формате PHP archive [6] — composer.phar. Далее создаём минимальный composer.json:
echo '{"require": {"silex/silex": "~1.1"} }' > composer.json
php composer.phar install
Далее создаём web/index.php:
<?php
// web/index.php
require_once __DIR__.'/../vendor/autoload.php';
$app = new SilexApplication();
// definitions
$app->run();
Всё, фреймворк Silex готов, установку и запуск веб сервера опустим, в интернете полно готовых описаний.
Проблема с менеджером пакетов заключается в том, что слишком часто приходится устанавливать одни и те же пакеты. Каждая новая установка проекта, это обращение к packagist.org [7] для нахождения источников зависимостей вашего пакета, зависимостей зависимостей и т.д. и дальнейшее скачивание необходимых пакетов. Справедливости ради стоит отметить, что у Composer есть встроенный кэш, но он хранится под ~/.composer/cache, и соответственно индивидуален для каждого пользователя, не говоря уже об отдельных средах для разработчиков, тестеров, QA, продакшн. И везде скачиваются одни и те же пакеты.
Большинство пакетов находятся на гитхабе, откуда скачиваются достаточно быстро чтоб не заворачиваться на локальные кэш. Но когда github в очередной раз [8] недоступен/тормозит из-за DDos, да ещё и размер зависимостей достигает сотен мегабайт — это становится проблемой. Github недоступен — работа стоит. Я предлагаю и в данный момент использую утилиту Satis.
Satis [9] — статическое хранилище Composer пакетов, ультра-легкая, статическая версии Packagist, может быть использована для размещения приватных пакетов вашей компании, или своих собственных.
Как видно из официального описания — главной целью Satis является возможность подключения приватных пакетов. Но так же Satis, имеет возможность скачивать пакеты из того же Packagist, хранить скаченные пакеты в zip или tar, а также раздавать их. Это нам и нужно. И так приступим к установке:
cd /path/to/your/webroot
sudo apt-get install git,curl; curl -sS https://getcomposer.org/installer | php
php composer.phar create-project composer/satis --stability=dev; cd satis
Далее создаём конфиг satis.json:
{
"name":"Project name",
"homepage":"http://packagist.example.com",
"archive":{
"directory":"dist",
"skip-dev":false
},
"repositories":[
{
"type":"composer",
"url":"https://packagist.org"
}
],
"require-dependencies":true,
"require":{
"silex/silex":">1"
}
}
И запускаем сборку:
php bin/satis build satis.json web/
Теперь нужно подправить конфиг пакетов в проекте который будет использовать наш Satis кэш, опять же воспользуемся примером Silex:
cd /path/to/your/webroot/silex
echo '{"repositories": [{ "type": "composer", "url": "http://packagist.example.com" },{ "packagist": false } ], "require": {"silex/silex": "~1.1"}}' > composer.json
{
"repositories":[
{
"type":"composer",
"url":"http://packagist.example.com"
},
{
"packagist":false
}
],
"require":{
"silex/silex":"~1.1"
}
}
Теперь, чтоб убедиться в работоспособности нашей структуры, нам нужно очистить кэш Composer, иначе Composer возьмёт пакет из своего кэша:
cd /path/to/your/webroot/silex; rm composer.lock; rm -fr vendor; rm -fr ~/.composer/cache
composer install
Всё. Если настройки правильные, теперь Composer будет брать пакеты из нашего локального кэша (http://packagist.example.com).
Минус предложенного решения в том, что кэшируемые пакеты приходится прописывать в конфигурационном файле Satis (satis.json) руками, то есть Satis не будет работать как прокси с авто-кэшингом, что на мой взгляд, является упущением. Так же нужно настроить крон скрипт который будет дёргать Satis build для обновления дев-пакетов и скачивания новых версий пакетов:
0 */12 * * * cd /path/to/your/webroot/satis/; php bin/satis build satis.json ./web/
P.S. неточности и ошибки прошу в личку.
P.S.S. другие решения кэшинга Composer пакетов, предлагаю обсудить в коментариях.
Автор: Casus
Источник [12]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/php-2/45739
Ссылки в тексте:
[1] Composer: http://getcomposer.org
[2] Packagist: https://packagist.org
[3] Пример: http://getcomposer.org/doc/05-repositories.md#package-2
[4] Пример: http://getcomposer.org/doc/05-repositories.md#packages
[5] Silex: http://silex.sensiolabs.org
[6] PHP archive: http://www.php.net/manual/ru/book.phar.php
[7] packagist.org: http://packagist.org
[8] очередной раз: http://www.securitylab.ru/news/445778.php
[9] Satis: http://getcomposer.org/doc/articles/handling-private-packages-with-satis.md
[10] packagist.example.com: http://packagist.example.com
[11] Composer ест много памяти: https://github.com/composer/composer/issues/1898
[12] Источник: http://habrahabr.ru/post/197666/
Нажмите здесь для печати.