it-swarm.com.ru

Используйте PHP composer для клонирования git repo

Я пытаюсь использовать composer для автоматического клонирования git-репозитория из github, которого нет в packagist , но он не работает, и я не могу понять, что я делаю неправильно.

Я думаю, что я должен включить его в "репозитории" следующим образом:

"repositories": [
    {
        "url": "https://github.com/l3pp4rd/DoctrineExtensions.git",
        "type": "git"
    }
],

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

Ваши требования не могут быть разрешены для устанавливаемого набора пакетов.

Кто-нибудь уже пытался сделать что-то подобное?

90
martin

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

В общем, если пакет доступен на packagist, не добавляйте репозиторий VCS. Это просто замедлит ход событий.


Для пакетов, которые недоступны через packagist, используйте репозиторий VCS (или git), как показано в вашем вопросе. Когда вы это сделаете, убедитесь, что:

  • Поле "repositories" указывается в корне 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 repo docs объясняет все это довольно хорошо.


Если есть репозиторий git (или другой VCS) с доступным composer.json, не используйте репозиторий "package". Репозитории требуют, чтобы вы указали все метаданных в определении и полностью проигнорируют любой composer.json, присутствующий в предоставленном dist и source , Они также имеют дополнительные ограничения, такие как запрет на правильное обновление в большинстве случаев.

Избегайте репозиториев ( см. Также документы ).

124
igorw

Вы можете включить репозиторий 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"
}
41
Edris

Просто скажите composer использовать источник, если он доступен:

composer update --prefer-source

Или же:

composer install --prefer-source

Затем вы получите пакеты в виде клонированных репозиториев вместо извлеченных архивов, чтобы вы могли внести некоторые изменения и зафиксировать их обратно. Конечно, при условии, что у вас есть права на запись/отправку в хранилище, и Composer знает о хранилище проекта.

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

Если Composer не знает, где находится репозиторий проекта, или у проекта нет надлежащего composer.json, ситуация немного сложнее, но другие уже отвечали на такие сценарии.

4
Josef Kufner

Я столкнулся со следующей ошибкой: 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 в вашем разделе require, вам придется переименовать пакет в файле composer.json внутри вашего нового репо.

{
    "name":         "foo/bar",

=>

{
    "name":         "my-foo/bar",

Если вы только что разбудили самый простой способ сделать это, отредактируйте его прямо в github.

3
Henry

В моем случае я использую Symfony2.3.x, а параметр минимальной стабильности по умолчанию "стабильный" (что хорошо). Я хотел импортировать репозиторий не в Packagist, но у меня возникла та же проблема: "Ваши требования не могут быть разрешены для устанавливаемого набора пакетов". Оказалось, что composer.json в репозитории, который я пытался импортировать, использует "dev" с минимальной стабильностью.

Поэтому, чтобы решить эту проблему, не забудьте проверить minimum-stability. Я решил это, потребовав версию dev-master вместо master, как указано в этом сообщение .

2
Magus

Если вы хотите использовать composer.json из GitHub, вы должны посмотреть этот пример (в разделе VCS).

Раздел пакетов предназначен для пакетов, которые не имеют composer.json. Тем не менее, вы не последовали этому примеру, иначе это также сработало бы. Прочтите, что говорится о репозиториях пакетов:

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

1
Clarence