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


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

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

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

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

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

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

7 78

7 ответов:

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

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

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

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

да?

ЕСТЬ ЛИ В РЕПОЗИТОРИИ composer.json FILE

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

перейти к @igorw ' s ответ

ИСПОЛЬЗУЙТЕ ЭТО ТОЛЬКО ЕСЛИ У ВАС НЕТ РЕПОЗИТОРИЯ
ИЛИ ЕСЛИ В РЕПОЗИТОРИИ НЕТ composer.json И ВЫ НЕ МОЖЕТЕ ДОБАВИТЬ ЕГО

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

С помощью package тип перенесет бремя правильного определения всего на вас. Самый простой способ-иметь в репозитории, и просто использовать его.

это решение действительно только для редких случаев, когда у вас есть заброшенная загрузка 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"
}

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

В общем случае, если пакет доступен на packagist,не добавить РЕПО VCS. Это просто замедлит процесс.


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

  • поле "репозитории" указано в корневом композиторе.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"
    }
}

The VCS repo docs объяснить все это довольно хорошо.


если есть 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

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

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

Если композитор не знает, где находится репозиторий проекта, или проект не имеет надлежащего композитора.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-адрес должен будет перейти в раздел репозиториев вашего композитора.формат JSON.

помните, если вы хотите обратиться к вашей вилке как my-foo/bar В разделе require вам нужно будет переименовать пакет в composer.json файл внутри вашего нового РЕПО.

{
    "name":         "foo/bar",

=>

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

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

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

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

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

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

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