Репозитории

  1. Концепции
    1. Пакет
    2. Репозиторий
  2. Типы
    1. Composer
      1. packages
      2. notify-batch
      3. provider-includes и providers-url
      4. Потоковые options
    2. VCS
      1. Загрузка пакета из хранилища VCS
      2. Использование личных репозиториев
      3. Альтернативы Git
      4. Параметры Subversion
    3. PEAR
      1. Пользовательский псевдоним vendor
    4. Пакет
  3. Собственный хостинг
    1. Частный пакетчик
    2. Сатис
    3. Артефакт
    4. Путь
  4. Отключение Packagist.org

В этой главе будет рассказано о концепции пакетов и репозиториев, о типах репозиториев и о том, как они работают.

Концепции #

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

Пакет #

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

Фактически, внутренне Composer рассматривает каждую версию как отдельный пакет. Хотя это различие не имеет значения, когда вы используете Composer, это очень важно, когда вы хотите его изменить.

В дополнение к названию и версии есть полезные метаданные. Наиболее важной для установки информацией является определение источника, в котором описывается, где получить содержимое пакета. Данные пакета указывают на содержимое пакета. И здесь есть два варианта: dist и source.

Dist. Дистрибутив - это пакетная версия данных пакета. Обычно выпущенная версия, как правило, стабильная версия.

Source: источник используется для разработки. Обычно это происходит из репозитория исходного кода, такого как git. Вы можете получить это, когда захотите изменить загруженный пакет.

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

Репозиторий #

Репозиторий - это источник пакета. Это список пакетов / версий. Composer будет искать во всех ваших репозиториях пакеты, которые потребуются вашему проекту.

По умолчанию в Composer регистрируется только репозиторий Packagist. Вы можете добавить больше репозиториев в свой проект, объявив их в composer.json.

Хранилища доступны только в корневом пакете, а репозитории, определенные в ваших зависимостях, не будут загружены. Прочтите статью "Часто задаваемые вопросы", если вы хотите узнать, почему.

Типы #

Composer #

Основным типом является репозиторий composer. Он использует один файл packages.json, который содержит все метаданные пакета.

Это также тип репозитория, который использует упаковщик. Чтобы ссылаться на репозиторий composer, просто укажите путь до файла packages.json. В случае с упаковщиком этот файл находится в /packages.json, поэтому URL-адресом репозитория будет packagist.org. Для example.org/packages.json URL-адрес хранилища будет example.org.

packages #

Единственное обязательное поле - это packages. Структура JSON выглядит следующим образом:

{
 "packages": {
 "vendor/package-name": {
 "dev-master": { @composer.json },
 "1.0.x-dev": { @composer.json },
 "0.0.1": { @composer.json },
 "1.0.0": { @composer.json }
 }
 }
}

Маркер @composer.json будет содержимым composer.json из этой версии пакета, включая как минимум:

  • name
  • version
  • dist or source

Вот минимальное определение пакета:

{
 "name": "smarty/smarty",
 "version": "3.1.7",
 "dist": {
 "url": "http://www.smarty.net/files/Smarty-3.1.7.zip",
 "type": "zip"
 }
}

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

notify-batch #

Поле notify-batch позволяет указать URL-адрес, который будет вызываться каждый раз, когда пользователь устанавливает пакет. URL-адрес может быть либо абсолютным путем (который будет использовать тот же домен, что и репозиторий), либо полным URL-адресом.

Пример значения:

{
 "notify-batch": "/downloads/"
}

Для example.org/packages.json, содержащего пакет monolog/monolog, это отправит запрос POST на example.org/downloads/ со следующим телом запроса JSON:

{
 "downloads": [
 {"name": "monolog/monolog", "version": "1.2.1.0"}
 ]
}

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

Это поле является необязательным.

provider-includes и providers-url #

Поле provider-includes позволяет вам отобразить набор файлов, в которых перечислены имена пакетов, предоставленные этим репозиторием. В этом случае хэш должен быть sha256 файлов.

URL-адрес providers-providers описывает, как файлы-провайдеры найдены на сервере. Это абсолютный путь из корня хранилища. Он должен содержать заполнители %package% и %hash%.

Пример:

{
 "provider-includes": {
 "providers-a.json": {
 "sha256": "f5b4bc0b354108ef08614e569c1ed01a2782e67641744864a74e788982886f4c"
 },
 "providers-b.json": {
 "sha256": "b38372163fac0573053536f5b8ef11b86f804ea8b016d239e706191203f6efac"
 }
 },
 "providers-url": "/p/%package%$%hash%.json"
}

Эти файлы содержат списки имен пакетов и хэшей для проверки целостности файла, например:

{
 "providers": {
 "acme/foo": {
 "sha256": "38968de1305c2e17f4de33aea164515bc787c42c7e2d6e25948539a14268bb82"
 },
 "acme/bar": {
 "sha256": "4dd24c930bd6e1103251306d6336ac813b563a220d9ca14f4743c032fb047233"
 }
 }
}

В вышеприведенном файле заявлено, что acme/foo и acme/bar могут быть найдены в этом репозитории, загрузив файл, на который ссылается provider-url, заменив %package% именем пакета поставщика и его имени и %hash% полем sha256. Эти файлы содержат определения пакетов, как описано выше.

Эти поля являются необязательными. Возможно, они вам не нужны для собственного репозитория.

Параметры stream #

Файл packages.json загружается с использованием потока PHP. Вы можете установить дополнительные параметры в этом потоке, используя параметр options. Вы можете установить любой допустимый контекст потока PHP. Дополнительные сведения см. в разделе Параметры и параметры контекста.

VCS #

VCS означает систему контроля версий. Сюда входят системы управления версиями, такие как git, svn, fossil или hg. Composer имеет тип репозитория для установки пакетов из этих систем.

Загрузка пакета из репозитория VCS #

Для этого есть несколько прецедентов. Наиболее распространенным является поддержка собственного вилка сторонней библиотеки. Если вы используете определенную библиотеку для своего проекта, и вы решили изменить что-то в библиотеке, вы захотите, чтобы ваш проект использовал исправленную версию. Если библиотека находится на GitHub (в большинстве случаев это так), вы можете просто раскошелиться и внести свои изменения в вилку. После этого вы обновляете проект composer.json. Все, что вам нужно сделать, это добавить ваш вил как репозиторий и обновить ограничение версии, чтобы указать на вашу собственную ветку. В качестве имени филиала необходимо указать префикс "dev-". Для соглашений о именовании ограничений версий см. Библиотеки для получения дополнительной информации.

Пример, предполагающий, что вы исправили монолог, чтобы исправить ошибку в ветке bugfix:

{
 "repositories": [
 {
 "type": "vcs",
 "url": "https://github.com/igorw/monolog"
 }
 ],
 "require": {
 "monolog/monolog": "dev-bugfix"
 }
}

Когда вы запустите php composer.phar update, вы должны получить модифицированную версию monolog/monolog вместо той, которая была у packagist.

Обратите внимание, что вам не следует переименовывать пакет, если вы на самом деле не намерены его форкнуть в долгосрочной перспективе и полностью отдалитесь от исходного пакета. Композитор правильно подберет ваш пакет по сравнению с оригиналом, поскольку пользовательский репозиторий имеет приоритет над пакетом. Если вы хотите переименовать пакет, вы должны сделать это в ветви по умолчанию (часто мастер), а не в ветке функции, так как имя пакета берется из ветви по умолчанию.

Также обратите внимание, что переопределение не будет работать, если вы измените свойство name в файле composer.json в файле forked repository, так как это должно соответствовать исходному для работы override.

Если другие зависимости полагаются на пакет, который вы разветвили, возможно inline-alias, чтобы оно соответствовало ограничению, которое иначе не было бы. Для получения дополнительной информации см. статью Псевдонимы.

Использование частных репозиториев #

Точно такое же решение позволяет работать с вашими частными репозиториями в GitHub и BitBucket:

{
 "require": {
 "vendor/my-private-repo": "dev-master"
 },
 "repositories": [
 {
 "type": "vcs",
 "url": "git@bitbucket.org:vendor/my-private-repo.git"
 }
 ]
}

Единственное требование - установка ключей SSH для клиента git.

Альтернативы Git #

Git - это не единственная система управления версиями, поддерживаемая репозиторием VCS. Поддерживаются следующие параметры:

Чтобы получить пакеты из этих систем, вам необходимо установить их соответствующие клиенты. Это может быть неудобно. И по этой причине есть специальная поддержка GitHub и BitBucket, которые используют API, предоставляемые этими сайтами, для извлечения пакетов без установки системы контроля версий. Репозиторий VCS предоставляет им dist'ы, которые приносят пакеты как почтовые индексы.

Используемый драйвер VCS автоматически определяется на основе URL-адреса. Однако, если вам нужно указать один из них по какой-либо причине, вы можете использовать fossil, git, svn или hg в качестве типа репозитория вместо vcs.

Если вы установите ключ no-api в true в репозитории github, он будет клонировать репозиторий, как и любой другой git-репозиторий, вместо использования API GitHub. Но, в отличие от использования git-драйвера напрямую, Composer по-прежнему будет пытаться использовать zip-файлы github.

Параметры Subversion #

Поскольку Subversion не имеет встроенной концепции ветвей и тегов, Composer по умолчанию предполагает, что код находится в $url/trunk, $url/branches и $url/tags. Если ваш репозиторий имеет другой макет, вы можете изменить эти значения. Например, если вы использовали заглавные имена, вы можете настроить репозиторий следующим образом:

{
 "repositories": [
 {
 "type": "vcs",
 "url": "http://svn.example.org/projectA/",
 "trunk-path": "Trunk",
 "branches-path": "Branches",
 "tags-path": "Tags"
 }
 ]
}

Если у вас нет каталогов ветвей или тегов, вы можете полностью их отключить, установив для branches-path или tags-path значение false.

Если пакет находится в подкаталоге, например, /trunk/foo/bar/composer.json и /tags/1.0/foo/bar/composer.json, то вы можете заставить Composer получить к нему доступ, установив параметр "package-path" в подкаталог, в этом примере он будет "package-path": "foo/bar/".

Если у вас есть приватное хранилище Subversion, вы можете сохранить учетные данные в разделе http-basic вашего конфига (см. статью Схема):

{
 "http-basic": {
 "svn.example.org": {
 "username": "username",
 "password": "password"
 }
 }
}

Если ваш клиент Subversion настроен для хранения учетных данных по умолчанию, эти учетные данные будут сохранены для текущего пользователя, а существующие сохраненные учетные данные для этого сервера будут перезаписаны. Чтобы изменить это поведение, установите параметр "svn-cache-credentials" в конфигурации вашего репозитория:

{
 "repositories": [
 {
 "type": "vcs",
 "url": "http://svn.example.org/projectA/",
 "svn-cache-credentials": false
 }
 ]
}

PEAR #

Можно установить пакеты из любого PEAR-канала, используя репозиторий pear. Composer будет префикс всех названий пакетов с pear-{channelName}/, чтобы избежать конфликтов. Все пакеты также имеют псевдонимы с префиксом pear-{channelAlias}/.

Пример использования pear2.php.net:

{
 "repositories": [
 {
 "type": "pear",
 "url": "https://pear2.php.net"
 }
 ],
 "require": {
 "pear-pear2.php.net/PEAR2_Text_Markdown": "*",
 "pear-pear2/PEAR2_HTTP_Request": "*"
 }
}

В этом случае короткое имя канала - pear2, поэтому имя пакета PEAR2_HTTP_Request становится pear-pear2/PEAR2_HTTP_Request.

Примечание. Репозиторий pear требует выполнения нескольких запросов на пакет, поэтому это может значительно замедлить процесс установки.

Пользовательский псевдоним vendor#

Можно назначить псевдонимы пакетов PEAR с помощью специального имени поставщика.

Пример:

Предположим, у вас есть приватный репозиторий PEAR и вы хотите использовать Composer для включения зависимостей от VCS. Ваш репозиторий PEAR содержит следующие пакеты:

  • BasePackage
  • IntermediatePackage, который зависит от BasePackage
  • TopLevelPackage1 и TopLevelPackage2, которые зависят от IntermediatePackage

Без псевдонима поставщика Composer будет использовать имя канала PEAR в качестве части поставщика имени пакета:

  • pear-pear.foobar.repo/BasePackage
  • pear-pear.foobar.repo/IntermediatePackage
  • pear-pear.foobar.repo/TopLevelPackage1
  • pear-pear.foobar.repo/TopLevelPackage2

Предположим, что в будущем вы захотите перенести свои PEAR-пакеты в репозиторий Composer и схему именования и принять имя поставщика foobar. Проекты, использующие ваши пакеты PEAR, не будут видеть обновленные пакеты, так как они имеют другое имя поставщика (foobar/IntermediatePackage против pear-pear.foobar.repo/IntermediatePackage).

Указав vendor-alias (псевдоним поставщика) для репозитория PEAR с самого начала, вы можете избежать этого сценария и защитить свои имена пакетов в будущем.

Чтобы проиллюстрировать, в следующем примере будут получены пакеты BasePackage, TopLevelPackage1 и TopLevelPackage2 из вашего репозитория PEAR и IntermediatePackage из репозитория Github:

{
 "repositories": [
 {
 "type": "git",
 "url": "https://github.com/foobar/intermediate.git"
 },
 {
 "type": "pear",
 "url": "http://pear.foobar.repo",
 "vendor-alias": "foobar"
 }
 ],
 "require": {
 "foobar/TopLevelPackage1": "*",
 "foobar/TopLevelPackage2": "*"
 }
}

Пакет #

Если вы хотите использовать проект, который не поддерживает Composer ни одним из вышеперечисленных способов, вы все равно можете определить пакет самостоятельно, используя репозиторий пакетов.

В принципе, вы определяете ту же информацию, которая включена в package.json репозитория composer, но только для одного пакета. Опять же, минимальные обязательные поля - это name, version и любой из dist или source.

Вот пример для механизма шаблонов smarty:

{
 "repositories": [
 {
 "type": "package",
 "package": {
 "name": "smarty/smarty",
 "version": "3.1.7",
 "dist": {
 "url": "http://www.smarty.net/files/Smarty-3.1.7.zip",
 "type": "zip"
 },
 "source": {
 "url": "http://smarty-php.googlecode.com/svn/",
 "type": "svn",
 "reference": "tags/Smarty_3_1_7/distribution/"
 },
 "autoload": {
 "classmap": ["libs/"]
 }
 }
 }
 ],
 "require": {
 "smarty/smarty": "3.1.*"
 }
}

Обычно вы оставляете исходную часть выключенной, так как она вам не нужна.

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

  • Composer не будет обновлять пакет, если вы не измените поле version.
  • Composer не будет обновлять ссылки фиксации, поэтому, если вы используете master как ссылку, вам придется удалить пакет, чтобы принудительно обновить, и вам придется иметь дело с нестабильным файлом блокировки.

Собственный хостинг #

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

  • Частные пакеты компаний. Если вы являетесь частью компании, которая использует Composer для своих пакетов внутри, вы можете сохранить эти пакеты частными.
  • Отдельная экосистема: если у вас есть проект, который имеет свою собственную экосистему, и пакеты не могут повторно использоваться большим сообществом PHP, вы можете захотеть сохранить их отдельно от упаковщика. Примером этого могут быть плагины Wordpress.

Для размещения собственных пакетов рекомендуется использовать репозиторий типа родного composer, который обеспечивает лучшую производительность.

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

Private Packagist #

Private Packagist - это размещенное или самодостаточное приложение, обеспечивающее размещение частных пакетов, а также зеркалирование GitHub, Packagist.org и других репозиториев пакетов.

Проверьте Packagist.com для получения дополнительной информации.

Satis #

Сатис - генератор репозитория статического composer. Это немного похоже на ультралегкую статическую версию пакета packagist на основе файлов.

Вы даете ему composer.json, содержащий репозитории, как правило, определения VCS и репозитория пакетов. Он выберет все необходимые пакеты и выведет пакет packages.json, который является репозиторием вашего composer.

Для получения дополнительной информации просмотрите репозиторий satis на GitHub и статью Satis.

Артефакт #

Есть некоторые случаи, когда нет возможности иметь в сети один из ранее упомянутых типов репозитория, даже один VCS. Типичным примером может быть межорганизационный обмен библиотекой через встроенные артефакты. Конечно, в большинстве случаев они частные. Чтобы упростить обслуживание, можно просто использовать репозиторий artifact типа с папкой, содержащей ZIP-архивы этих частных пакетов:

{
 "repositories": [
 {
 "type": "artifact",
 "url": "path/to/directory/with/zips/"
 }
 ],
 "require": {
 "private-vendor-one/core": "15.6.2",
 "private-vendor-two/connectivity": "*",
 "acme-corp/parser": "10.3.5"
 }
}

Каждый артефакт zip - это просто ZIP-архив с composer.json в корневой папке:

unzip -l acme-corp-parser-10.3.5.zip

composer.json
...

Если есть два архива с разными версиями пакета, они оба импортируются. Когда архив с более новой версией добавляется в папку артефактов и выполняется update, эта версия будет импортироваться, а Composer обновит ее до последней версии.

Путь #

В дополнение к репозитарию артефактов вы можете использовать путь один, который позволяет вам зависеть от локального каталога, абсолютного или относительного. Это может быть особенно полезно при работе с монолитными репозиториями.

Например, если у вас есть следующая структура каталогов в вашем репозитории:

- apps
\_ my-app
 \_ composer.json
- packages
\_ my-package
 \_ composer.json
 

Затем, чтобы добавить пакет my/package в качестве зависимости, в вашем файле apps/my-app/composer.json вы можете использовать следующую конфигурацию:

 {
 "repositories": [
 {
 "type": "path",
 "url": "../../packages/my-package"
 }
 ],
 "require": {
 "my/package": "*"
 }
}

Если пакет является локальным хранилищем VCS, версия может быть выведена ветвью или тегом, который в настоящее время извлечен. В противном случае, версия должна быть явно определена в файле composer.json пакета. Если версия не может быть разрешена с помощью этих средств, предполагается, что это dev-master.

Если возможно, локальный пакет будет символически связан, и в этом случае вывод в консоли будет читать Symlinked из ../../packages/my-package. Если символическая ссылка не возможна, пакет будет скопирован. В этом случае консоль выведет Mirrored из ../../packages/my-package.

Вместо стандартной резервной стратегии вы можете заставить использовать символическую ссылку с "symlink": true или зеркалирование с "symlink": false. Принудительное зеркалирование может быть полезно при развертывании или создании пакета из монолитного репозитория.

{
 "repositories": [
 {
 "type": "path",
 "url": "../../packages/my-package",
 "options": {
 "symlink": false
 }
 }
 ]
}

Ведущие тильды расширяются до домашней папки текущего пользователя, а переменные среды анализируются как в нотациях Windows, так и в Linux/Mac. Например, ~/git/mypackage автоматически загрузит клон mypackage из /home//git/mypackage, что эквивалентно $HOME/git/mypackage или %USERPROFILE%/git/mypackage.

Примечание. Пути хранилища также могут содержать подстановочные знаки, например * и?. Подробности см. в функции PHP glob.

Отключение Packagist.org #

Вы можете отключить репозиторий Packagist.org по умолчанию, добавив его в свой composer.json:

{
 "repositories": [
 {
 "packagist.org": false
 }
 ]
}

← Схема composer.jsonКонфигурация →