Использовать PHP-композитор для клонирования git repo
Я пытаюсь использовать composer, чтобы автоматически клонировать репозиторий git из github, который не находится в packagist, но он не работает, и я не могу понять, что я делаю неправильно.
Я думаю, что я должен включить его в "репозитории" так:
"repositories": [
{
"url": "https://github.com/l3pp4rd/DoctrineExtensions.git",
"type": "git"
}
],
а затем, вероятно, перечислите его в разделе "require". Он должен быть похож на этот пример, но он не работает. Он просто дает эту ошибку:
Ваши требования не могут быть разрешены к устанавливаемому набору пакетов.
Кто-нибудь уже пытался сделать что-то подобное?
Ответы
Ответ 1
На момент написания в 2013 году это был один из способов сделать это. Composer добавил поддержку для лучших способов: см. @igorw answer
У ВАС ЕСТЬ РЕПОЗИТОРИЯ?
Git, Mercurial, SVN поддерживается Composer.
ВЫ НАПИСАЛИ ДОСТУП К РЕПОЗИТОРУ?
Да?
У РЕПОЗИТОРИИ есть composer.json
ФАЙЛ
Если у вас есть репозиторий, вы можете написать: Добавить файл composer.json
или исправить существующий, и НЕ использовать нижеприведенное решение.
Перейдите в @igorw answer
ТОЛЬКО ИСПОЛЬЗУЙТЕ ЭТО, ЕСЛИ ВЫ НЕ ИМЕЕТЕ РЕПОЗИТОРИЯ
ИЛИ ЕСЛИ РЕПОЗИТОРИЯ НЕ ИМЕЕТ A 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"
}
Ответ 2
Этот пакет фактически доступен через packagist. В этом случае вам не нужно настраивать определение репозитория. Просто убедитесь, что вы добавили require
(который всегда необходим) с соответствующим ограничением версии.
В общем случае, если пакет доступен для packagist, не добавить репозиторий VCS. Это просто замедлит работу.
Для пакетов, которые недоступны через packagist, используйте VCS (или git) репозиторий, как показано в вашем вопросе. Когда вы это сделаете, убедитесь, что:
- Поле "репозитории" указано в корневом файле composer.json(это поле только для корня, определения репозитория из необходимых пакетов игнорируются)
- Определение репозиториев указывает на действительный репозиторий VCS
- Если тип "git" вместо "vcs" (как в вашем вопросе), убедитесь, что это фактически git repo
- У вас есть
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 repo docs объясняют все это довольно хорошо.
Если существует репозиторий git (или другой VCS) с composer.json
, не, используйте репозиторий "package". Пакетные репозитории требуют, чтобы вы предоставили все метаданные в определении и полностью игнорируете любой composer.json
, присутствующий в предоставленном dist и источнике. Они также имеют дополнительные ограничения, например, не допускающие надлежащего обновления в большинстве случаев.
Избегайте пакетных репозиций (см. также документы).
Ответ 3
Вы можете включить репозиторий 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"
}
Ответ 4
В моем случае я использую Symfony2.3.x, а параметр минимальной стабильности по умолчанию "стабильный" (что хорошо). Я хотел импортировать репо не в packagist, но имел ту же проблему: "Ваши требования не могут быть решены с помощью устанавливаемого набора пакетов".
Оказалось, что композитор .json в репо, который я пытался импортировать, использовал "dev" с минимальной стабильностью.
Чтобы решить эту проблему, не забудьте проверить minimum-stability
. Я решил это, требуя версию dev-master
вместо master
, как указано в этом post.
Ответ 5
Я столкнулся со следующей ошибкой: 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-адрес должен будет войти в ваш раздел репозиториев вашего композитора .json.
Помните, что если вы хотите обратиться к своей вилке как my-foo/bar
в разделе require, вам придется переименовать пакет в файле composer.json
внутри вашего нового репо.
{
"name": "foo/bar",
=>
{
"name": "my-foo/bar",
Если вы просто проложили самый простой способ сделать это, отредактируйте его прямо внутри github.
Ответ 6
Просто скажите композитору использовать источник, если он доступен:
composer update --prefer-source
Или:
composer install --prefer-source
Затем вы получите пакеты как клонированные репозитории вместо извлеченных архивов, чтобы вы могли внести некоторые изменения и скопировать их обратно. Конечно, если у вас есть права на запись /push в репозиторий, а Composer знает о репозитории проекта.
Отказ от ответственности: я думаю, что могу ответить на немного другой вопрос, но именно этого я и искал, когда нашел этот вопрос, поэтому надеюсь, что он будет полезен и другим.
Если Composer не знает, где репозиторий проекта, или у проекта нет надлежащего composer.json, ситуация немного сложнее, но другие уже ответили на такие сценарии.
Ответ 7
Если вы хотите использовать composer.json
из GitHub, вы можете посмотреть этот пример (в разделе VCS).
Раздел пакета предназначен для пакетов, у которых нет composer.json
. Однако вы также не выполнили этот пример, иначе он также сработал. Прочитайте, что он говорит о репозиториях пакетов:
В основном вы определяете ту же информацию, которая включена в репозиторий композитора packages.json
, но только для одного пакета. Опять же, минимальные обязательные поля - это имя, версия и любой из dist или source.