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

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

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

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

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

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

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

7 ответов


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

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

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

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

да?

ЕСТЬ ЛИ В РЕПОЗИТОРИИ

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

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

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

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

С помощью package type перенесет бремя правильного определения всего на вас. Более простой способ-иметь 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"
}

этот пакет на самом деле доступен через 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"
    }
}

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


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

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

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