Используйте PHP composer для клонирования репозитория git
Я пытаюсь использовать композитора для автоматического клонирования репозитория git с github, которого нет в упаковщике, но он не работает, и я не могу понять, что я делаю неправильно.
Я думаю, что должен включить его в число "хранилищ", например:
"repositories": [
{
"url": "https://github.com/l3pp4rd/DoctrineExtensions.git",
"type": "git"
}
],
А затем, вероятно, перечислите его в разделе "требуется". Это должно быть похоже на в этом примере , но это не работает. Он просто выдает эту ошибку:
Ваши требования не могут быть решены, чтобы устанавливаемый набор пакетов.
Кто-нибудь уже пытался сделать что-то подобное?
7 answers
На момент написания статьи в 2013 году это был один из способов сделать это. Композитор добавил поддержку лучших способов: Смотрите ответ @igorw
У ВАС ЕСТЬ ХРАНИЛИЩЕ?
Git, Mercurial, SVN поддерживаются композитором.
ЕСТЬ ЛИ У ВАС ДОСТУП НА ЗАПИСЬ В РЕПОЗИТОРИЙ?
Да?
ЕСТЬ ЛИ В РЕПОЗИТОРИИ ФАЙЛ composer.json
Если у вас есть репозиторий, вы можете написать: Добавьте файл composer.json
или исправьте существующий один, и НЕ используйте решение, приведенное ниже.
ИСПОЛЬЗУЙТЕ ЭТО ТОЛЬКО В ТОМ СЛУЧАЕ, ЕСЛИ У ВАС НЕТ ХРАНИЛИЩА
ИЛИ ЕСЛИ В РЕПОЗИТОРИИ НЕТ composer.json
, И ВЫ НЕ МОЖЕТЕ ЕГО ДОБАВИТЬ
Это переопределит все, что Composer может прочитать из исходного репозитория composer.json
, включая зависимости пакета и автоматическую загрузку.
Использование типа package
перенесет бремя правильного определения все на тебя. Более простой способ - иметь файл composer.json
в репозитории и просто использовать его.
Это решение действительно предназначено только для редких случаев, когда у вас есть заброшенная загрузка ZIP, которую вы не можете изменить, или хранилище, которое вы можете только читать, но оно больше не поддерживается.
"repositories": [
{
"type":"package",
"package": {
"name": "l3pp4rd/doctrine-extensions",
"version":"master",
"source": {
"url": "https://github.com/l3pp4rd/DoctrineExtensions.git",
"type": "git",
"reference":"master"
}
}
}
],
"require": {
"l3pp4rd/doctrine-extensions": "master"
}
Этот пакет на самом деле доступен через упаковщика. В этом случае вам не нужно пользовательское определение репозитория. Просто убедитесь, что вы добавили require
(что всегда необходимо) с соответствующим ограничением версии.
В общем случае, если пакет доступен на packagist, не добавляйте репозиторий VCS. Это просто замедлит ход событий.
Для пакетов, которые недоступны через packagist, используйте репозиторий VCS (или git), как показано в вашем вопрос. Когда вы это сделаете, убедитесь, что:
- Поле "репозитории" указано в корневом файле composer.json (это поле только для корневого, определения репозиториев из требуемых пакетов игнорируются)
- Определение репозиториев указывает на допустимое репозиторий VCS
- Если тип "git" вместо "vcs" (как в вашем вопросе), убедитесь, что это на самом деле репозиторий git
- У вас есть
require
для рассматриваемого пакета - Ограничение в
require
соответствует версии, предоставленные репозиторием VCS. Вы можете использоватьcomposer show <packagename>
для поиска доступных версий. В этом случае~2.3
было бы хорошим вариантом. - Имя в
require
совпадает с именем в удаленномcomposer.json
. В данном случае этоgedmo/doctrine-extensions
.
Вот пример composer.json
, который устанавливает тот же пакет через репозиторий VCS:
{
"repositories": [
{
"url": "https://github.com/l3pp4rd/DoctrineExtensions.git",
"type": "git"
}
],
"require": {
"gedmo/doctrine-extensions": "~2.3"
}
}
Документы репо VCS объясняют все это довольно хорошо.
Если есть репозиторий git (или другой VCS) с composer.json
доступным, сделайте не используйте репозиторий "пакет". Репозитории пакетов требуют, чтобы вы предоставили все метаданных в определении и полностью игнорировали любые composer.json
, присутствующие в предоставленном dist и источнике. У них также есть дополнительные ограничения, такие как в большинстве случаев невозможность надлежащего обновления.
Избегайте репозиториев пакетов ( смотрите также документы).
Вы можете включить репозиторий git в composer.json следующим образом:
"repositories": [
{
"type": "package",
"package": {
"name": "example-package-name", //give package name to anything, must be unique
"version": "1.0",
"source": {
"url": "https://github.com/example-package-name.git", //git url
"type": "git",
"reference": "master" //git branch-name
}
}
}],
"require" : {
"example-package-name": "1.0"
}
Просто скажите композитору использовать исходный код, если он доступен:
composer update --prefer-source
Или:
composer install --prefer-source
Затем вы получите пакеты в виде клонированных репозиториев вместо извлеченных архивов, чтобы вы могли внести некоторые изменения и зафиксировать их обратно. Конечно, при условии, что у вас есть разрешения на запись/отправку в репозиторий, и композитор знает о репозитории проекта.
Отказ от ответственности: Я думаю, что могу ответить на немного другой вопрос, но это было то, что я искал, когда нашел этот вопрос, поэтому я надеюсь, это будет полезно и другим.
Если Composer не знает, где находится репозиторий проекта, или у проекта нет надлежащего composer.json, ситуация немного сложнее, но другие уже ответили на такие сценарии.
Я столкнулся со следующей ошибкой: The requested package my-foo/bar could not be found in any version, there may be a typo in the package name.
Если вы разветвляете другое репо, чтобы внести свои собственные изменения, вы получите новое хранилище.
Например:
https://github.com/foo/bar.git
=>
https://github.com/my-foo/bar.git
Новый URL-адрес нужно будет ввести в раздел репозиториев вашего composer.json.
Помните, что если вы хотите ссылаться на свою вилку как my-foo/bar
в разделе "Требуется", вам придется переименовать пакет в файле composer.json
внутри вашего нового репозитория.
{
"name": "foo/bar",
=>
{
"name": "my-foo/bar",
Если вы только что раздвоили самый простой способ сделать это - отредактировать его прямо в github.
В моем случае я использую Symfony2.3.x, и параметр минимальной стабильности по умолчанию "стабильный" (что хорошо). Я хотел импортировать репозиторий не в packagist, но у меня была та же проблема "Ваши требования не могут быть решены для устанавливаемого набора пакетов".. Оказалось, что composer.json в репозитории, который я пытался импортировать, использует "dev" с минимальной стабильностью.
Поэтому, чтобы решить эту проблему, не забудьте проверить minimum-stability
. Я решил это, потребовав версию dev-master
вместо master
, как указано в этом посте .
Если вы хотите использовать composer.json
с GitHub, вы бы посмотрели на этот пример (в разделе VCS).
Раздел пакетов предназначен для пакетов, у которых нет composer.json
. Однако вы также не последовали этому примеру, иначе это тоже сработало бы. Прочитайте, что там говорится о репозиториях пакетов:
В принципе, вы определяете ту же информацию, которая включена в репозиторий composer
packages.json
, но только для одного пакета. Опять же, необходимый минимум поля - это имя, версия и либо dist, либо источник.