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


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

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

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

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

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

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

Author: kenorb, 2012-10-18

7 answers

На момент написания статьи в 2013 году это был один из способов сделать это. Композитор добавил поддержку лучших способов: Смотрите ответ @igorw

У ВАС ЕСТЬ ХРАНИЛИЩЕ?

Git, Mercurial, SVN поддерживаются композитором.

ЕСТЬ ЛИ У ВАС ДОСТУП НА ЗАПИСЬ В РЕПОЗИТОРИЙ?

Да?

ЕСТЬ ЛИ В РЕПОЗИТОРИИ ФАЙЛ composer.json

Если у вас есть репозиторий, вы можете написать: Добавьте файл composer.json или исправьте существующий один, и НЕ используйте решение, приведенное ниже.

Перейдите к ответу @igorw

ИСПОЛЬЗУЙТЕ ЭТО ТОЛЬКО В ТОМ СЛУЧАЕ, ЕСЛИ У ВАС НЕТ ХРАНИЛИЩА
ИЛИ ЕСЛИ В РЕПОЗИТОРИИ НЕТ 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"
}
 83
Author: Mike Graf, 2017-05-23 10:31:37

Этот пакет на самом деле доступен через упаковщика. В этом случае вам не нужно пользовательское определение репозитория. Просто убедитесь, что вы добавили 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 и источнике. У них также есть дополнительные ограничения, такие как в большинстве случаев невозможность надлежащего обновления.

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

 113
Author: igorw, 2013-08-18 10:54:27

Вы можете включить репозиторий 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"
}
 36
Author: Edris, 2014-12-11 13:14:32

Просто скажите композитору использовать исходный код, если он доступен:

composer update --prefer-source

Или:

composer install --prefer-source

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

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

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

 2
Author: Josef Kufner, 2016-11-24 23:18:30

Я столкнулся со следующей ошибкой: 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.

 2
Author: Henry, 2017-03-29 23:04:43

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

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

 2
Author: Magus, 2017-11-14 23:25:01

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

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

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

 1
Author: Clarence, 2017-11-14 23:23:31