В этой главе будет рассказано о концепции пакетов и репозиториев, о типах репозиториев и о том, как они работают. Концепции #Прежде чем мы рассмотрим различные существующие типы репозиториев, нам нужно понять некоторые из основных концепций, на которых построен Composer. Пакет #Composer - это диспетчер зависимостей. Он устанавливает пакеты локально. Пакет - это просто каталог, содержащий что-то. В данном случае это PHP-код, но в теории это может быть что угодно. И он содержит описание пакета, у которого есть имя и версия. Имя и версия используются для идентификации пакета. Фактически, внутренне Composer рассматривает каждую версию как отдельный пакет. Хотя это различие не имеет значения, когда вы используете Composer, это очень важно, когда вы хотите его изменить. В дополнение к названию и версии есть полезные метаданные. Наиболее важной для установки информацией является определение источника, в котором описывается, где получить содержимое пакета. Данные пакета указывают на содержимое пакета. И здесь есть два варианта: dist и source. Dist. Дистрибутив - это пакетная версия данных пакета. Обычно выпущенная версия, как правило, стабильная версия. Source: источник используется для разработки. Обычно это происходит из репозитория исходного кода, такого как git. Вы можете получить это, когда захотите изменить загруженный пакет. Пакеты могут поставлять любой из них, или даже оба. В зависимости от определенных факторов, таких как пользовательские параметры и стабильность пакета, будет предпочтительнее. Репозиторий #Репозиторий - это источник пакета. Это список пакетов / версий. Composer будет искать во всех ваших репозиториях пакеты, которые потребуются вашему проекту. По умолчанию в Composer регистрируется только репозиторий Packagist. Вы можете добавить больше репозиториев в свой проект, объявив их в Хранилища доступны только в корневом пакете, а репозитории, определенные в ваших зависимостях, не будут загружены. Прочтите статью "Часто задаваемые вопросы", если вы хотите узнать, почему. Типы #Composer #Основным типом является репозиторий Это также тип репозитория, который использует упаковщик. Чтобы ссылаться на репозиторий packages #Единственное обязательное поле - это { "packages": { "vendor/package-name": { "dev-master": { @composer.json }, "1.0.x-dev": { @composer.json }, "0.0.1": { @composer.json }, "1.0.0": { @composer.json } } } } Маркер
Вот минимальное определение пакета: { "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": "/downloads/" } Для { "downloads": [ {"name": "monolog/monolog", "version": "1.2.1.0"} ] } Поле версии будет содержать нормализованное представление номера версии. Это поле является необязательным. provider-includes и providers-url #Поле URL-адрес Пример: { "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" } } } В вышеприведенном файле заявлено, что Эти поля являются необязательными. Возможно, они вам не нужны для собственного репозитория. Параметры stream #Файл VCS #VCS означает систему контроля версий. Сюда входят системы управления версиями, такие как git, svn, fossil или hg. Composer имеет тип репозитория для установки пакетов из этих систем. Загрузка пакета из репозитория VCS #Для этого есть несколько прецедентов. Наиболее распространенным является поддержка собственного вилка сторонней библиотеки. Если вы используете определенную библиотеку для своего проекта, и вы решили изменить что-то в библиотеке, вы захотите, чтобы ваш проект использовал исправленную версию. Если библиотека находится на GitHub (в большинстве случаев это так), вы можете просто раскошелиться и внести свои изменения в вилку. После этого вы обновляете проект Пример, предполагающий, что вы исправили монолог, чтобы исправить ошибку в ветке { "repositories": [ { "type": "vcs", "url": "https://github.com/igorw/monolog" } ], "require": { "monolog/monolog": "dev-bugfix" } } Когда вы запустите Обратите внимание, что вам не следует переименовывать пакет, если вы на самом деле не намерены его форкнуть в долгосрочной перспективе и полностью отдалитесь от исходного пакета. Композитор правильно подберет ваш пакет по сравнению с оригиналом, поскольку пользовательский репозиторий имеет приоритет над пакетом. Если вы хотите переименовать пакет, вы должны сделать это в ветви по умолчанию (часто мастер), а не в ветке функции, так как имя пакета берется из ветви по умолчанию. Также обратите внимание, что переопределение не будет работать, если вы измените свойство Если другие зависимости полагаются на пакет, который вы разветвили, возможно 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 предоставляет им
Используемый драйвер VCS автоматически определяется на основе URL-адреса. Однако, если вам нужно указать один из них по какой-либо причине, вы можете использовать Если вы установите ключ Параметры Subversion #Поскольку Subversion не имеет встроенной концепции ветвей и тегов, Composer по умолчанию предполагает, что код находится в { "repositories": [ { "type": "vcs", "url": "http://svn.example.org/projectA/", "trunk-path": "Trunk", "branches-path": "Branches", "tags-path": "Tags" } ] } Если у вас нет каталогов ветвей или тегов, вы можете полностью их отключить, установив для Если пакет находится в подкаталоге, например, Если у вас есть приватное хранилище Subversion, вы можете сохранить учетные данные в разделе http-basic вашего конфига (см. статью Схема): { "http-basic": { "svn.example.org": { "username": "username", "password": "password" } } } Если ваш клиент Subversion настроен для хранения учетных данных по умолчанию, эти учетные данные будут сохранены для текущего пользователя, а существующие сохраненные учетные данные для этого сервера будут перезаписаны. Чтобы изменить это поведение, установите параметр { "repositories": [ { "type": "vcs", "url": "http://svn.example.org/projectA/", "svn-cache-credentials": false } ] } PEAR #Можно установить пакеты из любого PEAR-канала, используя репозиторий Пример использования { "repositories": [ { "type": "pear", "url": "https://pear2.php.net" } ], "require": { "pear-pear2.php.net/PEAR2_Text_Markdown": "*", "pear-pear2/PEAR2_HTTP_Request": "*" } } В этом случае короткое имя канала - Примечание. Репозиторий
Пользовательский псевдоним vendor#Можно назначить псевдонимы пакетов PEAR с помощью специального имени поставщика. Пример: Предположим, у вас есть приватный репозиторий PEAR и вы хотите использовать Composer для включения зависимостей от VCS. Ваш репозиторий PEAR содержит следующие пакеты:
Без псевдонима поставщика Composer будет использовать имя канала PEAR в качестве части поставщика имени пакета:
Предположим, что в будущем вы захотите перенести свои PEAR-пакеты в репозиторий Composer и схему именования и принять имя поставщика Указав Чтобы проиллюстрировать, в следующем примере будут получены пакеты { "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 ни одним из вышеперечисленных способов, вы все равно можете определить пакет самостоятельно, используя репозиторий пакетов. В принципе, вы определяете ту же информацию, которая включена в Вот пример для механизма шаблонов 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.*" } } Обычно вы оставляете исходную часть выключенной, так как она вам не нужна.
Собственный хостинг #Хотя вы, вероятно, захотите поместить свои пакеты на упаковщик в большинстве случаев, есть несколько прецедентов для размещения вашего собственного репозитория.
Для размещения собственных пакетов рекомендуется использовать репозиторий типа родного Есть несколько инструментов, которые могут помочь вам создать репозиторий Private Packagist #Private Packagist - это размещенное или самодостаточное приложение, обеспечивающее размещение частных пакетов, а также зеркалирование GitHub, Packagist.org и других репозиториев пакетов. Проверьте Packagist.com для получения дополнительной информации. Satis #Сатис - генератор репозитория статического Вы даете ему Для получения дополнительной информации просмотрите репозиторий satis на GitHub и статью Satis. Артефакт #Есть некоторые случаи, когда нет возможности иметь в сети один из ранее упомянутых типов репозитория, даже один VCS. Типичным примером может быть межорганизационный обмен библиотекой через встроенные артефакты. Конечно, в большинстве случаев они частные. Чтобы упростить обслуживание, можно просто использовать репозиторий { "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-архив с unzip -l acme-corp-parser-10.3.5.zip composer.json ... Если есть два архива с разными версиями пакета, они оба импортируются. Когда архив с более новой версией добавляется в папку артефактов и выполняется Путь #В дополнение к репозитарию артефактов вы можете использовать путь один, который позволяет вам зависеть от локального каталога, абсолютного или относительного. Это может быть особенно полезно при работе с монолитными репозиториями. Например, если у вас есть следующая структура каталогов в вашем репозитории: - apps \_ my-app \_ composer.json - packages \_ my-package \_ composer.json Затем, чтобы добавить пакет { "repositories": [ { "type": "path", "url": "../../packages/my-package" } ], "require": { "my/package": "*" } } Если пакет является локальным хранилищем VCS, версия может быть выведена ветвью или тегом, который в настоящее время извлечен. В противном случае, версия должна быть явно определена в файле Если возможно, локальный пакет будет символически связан, и в этом случае вывод в консоли будет читать Вместо стандартной резервной стратегии вы можете заставить использовать символическую ссылку с { "repositories": [ { "type": "path", "url": "../../packages/my-package", "options": { "symlink": false } } ] } Ведущие тильды расширяются до домашней папки текущего пользователя, а переменные среды анализируются как в нотациях Windows, так и в Linux/Mac. Например, Примечание. Пути хранилища также могут содержать подстановочные знаки, например * и?. Подробности см. в функции PHP glob. Отключение Packagist.org #Вы можете отключить репозиторий Packagist.org по умолчанию, добавив его в свой { "repositories": [ { "packagist.org": false } ] } |