Подтвердить что ты не робот

Использовать PHP-композитор для клонирования git repo

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

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

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

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

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

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

4b9b3361

Ответ 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.