Використовуйте PHP-композитор для клонування git repo


111

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

Я думаю, що я маю включити його до "сховищ" так:

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

а потім, ймовірно, перерахуйте його в розділі "вимагати". Це має бути подібним до цього прикладу, але він не працює. Він просто дає цю помилку:

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

Хтось уже намагався зробити щось подібне?

Відповіді:


109

На момент написання в 2013 році це був один із способів. Композитор додана підтримка більш ефективних способів: Див @igorw «s відповідь

У вас є РЕПОЗИТОРІЯ?

Git, Mercurial і SVN підтримуються композитором.

ВИ ВИ ПИСАЄМО ДОСТУП ДО РЕПОЗИТОРІЇ?

Так?

РЕПОЗИТОРІЯ МАЄ composer.jsonФАЙЛ

Якщо у вас є сховище, до якого ви можете написати: Додати composer.jsonфайл або виправити існуючий, і НЕ використовуйте рішення, наведене нижче.

Перейти до @igorw «s відповідь

ТОЛЬКО ВИКОРИСТОВУЙТЕ ЦЕ, АКО ВИ НЕ МАЄТЕ РЕПОЗИТОРІЇ
АБО ЯКЩО РЕПОЗИТОРІЯ НЕ МАЄ, А composer.jsonВАМ НЕ МОЖЕ ДОДАТИ

Це скасує все, що може прочитати Композитор з оригінального сховища 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"
}

7
Заміна сховища VCS на сховище пакетів - погана ідея. Цільове репо вже має a composer.json, тому використовуйте vcs repo. Ваш приклад також порушує автоматичне завантаження та ігнорує branch-alias.
igorw

1
@igorw Ви можете, будь ласка, зв’язати цю інформацію, щоб я та інші могли зрозуміти різницю? Дякую.
Майк Граф

5
Як пояснено на сторінці сховищ, пакет репо повинен містити всю інформацію. Якщо ви не додасте autoloadполе, воно не буде включене. В основному вам потрібно скопіювати та вставити всю інформацію з composer.jsonвизначення репо. Repo VCS отримує цю інформацію безпосередньо від VCS. Переваги branch-aliasпояснюються в документі псевдонімів та в блозі, який я написав .
igorw

2
Чому це все ще підтримується? Документи композитора навіть прямо заявляють, що слід уникати репост пакетів. Будь ласка, припиніть заохочувати погані практики.
igorw

1
Що ти радиш, щоб потім змінити його?
Майк Граф

146

Цей пакет фактично доступний через пакувальника . У цьому випадку вам не потрібне спеціальне визначення сховища. Просто переконайтеся, що ви додали require(що завжди потрібно) з обмеженням відповідної версії.

Як правило, якщо пакет доступний для пакетиста, не додайте репо-VCS. Це просто сповільнить справи.


Для пакетів, які недоступні через пакетів, використовуйте сховище 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"
    }
}

The VCS repo пояснюють все це досить добре.


Якщо є сховище git (або інший VCS) з composer.jsonнаявним, не використовуйте репо-пакет "пакет". Репост пакету вимагає, щоб ви вказали всі метадані у визначенні та заповіті повністю ігноруєте будь-який composer.jsonприсутній у наданому dist та джерелі. Вони також мають додаткові обмеження, наприклад, не допускаючи належних оновлень у більшості випадків.

Уникайте репост пакетів ( див. Також документи ).


1
О, дякую! Я не знайшов його, тому що думав, що він буде викликаний після git repo DoctrineExtensions.
март

2
Завжди дивіться на ім’я, вказане в composer.json.
igorw

16
-1 Чому це позначено як правильну відповідь? Це, безумовно, вирішило проблему ОП, але Кларенс та Майк Граф дали відповіді на більш загальну проблему, що стоїть перед нею. Навряд чи хтось, хто шукає спосіб включення непакетних проектів, захотів би включити DoctrineExtensions.
aefxx

2
@aefxx Моя відповідь робить насправді пояснити загальну загальну проблему, яка є те , що requireполе повинно бути вказано.
igorw

6
The VCS repo docs explain all of this quite well.... що?
hek2mgl

47

Ви можете включити сховище 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"
}

1
Як пояснено в інших відповідях вище: Якщо у вас є сховище, додайте composer.jsonфайл, якщо це можливо.
Свен

@Sven ... тому що неможливо інакше вказати конкретну комісію?
Cees Timmerman

Дякую за те, що ви поділилися, врятували мене години :)
metamaker

Це налаштовано на загальне, але в іншому випадку це звичайна копія відповіді Майка Графа, тож я не впевнений, що загальне краще, ніж бачити конкретну бібліотеку у питанні як приклад.
FantomX1

6

Просто скажіть композитору використовувати джерело, якщо воно доступне:

composer update --prefer-source

Або:

composer install --prefer-source

Тоді ви отримаєте пакети як клоновані сховища замість витягнутих тарболів, тож ви зможете внести деякі зміни та зробити їх назад. Звичайно, якщо припустити, що у сховище є дозволи на записування / натискання, і композитор знає про сховище проекту.

Відмова: Я думаю, що, можливо, я відповів на трохи інше запитання, але це те, що я шукав, коли знайшов це питання, тож сподіваюся, що воно буде корисним і для інших.

Якщо композитор не знає, де знаходиться сховище проекту, або проект не має належного composer.json, ситуація дещо складніша, але інші відповіли на такі сценарії вже.


3

У мене виникла така помилка: 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.


Зауважте, що назва пакету жодним чином не відображає URL-адресу, з якої ви можете прочитати сховище! Не існує автоматичного зв’язку між ними, обидва можна вибрати самостійно. Єдина відповідна інформація щодо композитора - це ім'я, записане в nameатрибуті всередині composer.json.
Свен

2

У моєму випадку я використовую Symfony2.3.x, а параметр мінімальної стійкості за замовчуванням "стабільний" (що добре). Я хотів імпортувати РЕПО не в упаковці, але мав те саме питання "Ваші вимоги не вдалося вирішити до встановленого набору пакетів." Виявилося, що composer.json у репортажі, який я намагався імпортувати, використовував мінімальну стабільність "dev".

Тож щоб вирішити цю проблему, не забудьте підтвердити це minimum-stability. Я вирішив це, вимагаючи dev-masterверсії замість masterзазначеної у цій публікації .


4
У мене була така ж проблема, яка обговорюється тут . Якщо у вас є чітка відповідь (як, наприклад, git commit), можливо, ви можете зробити щось на кшталт "dev-master#4536bbc166ada96ff2a3a5a4b6e636b093103f0e".
Blaskovicz

1

Якщо ви хочете використовувати composer.jsonвід GitHub, ви подивитесь на цей приклад (під розділом VCS).

Розділ пакунків призначений для пакетів, у яких немає composer.json. Однак ви також не наслідували цього прикладу, інакше він би спрацював. Читайте, що там написано про сховища пакетів:

В основному ви визначаєте ту саму інформацію, яка входить у сховище композитора packages.json, але лише для одного пакету. Знову ж таки, мінімально необхідні поля - це ім’я, версія та або dist, або джерело.


0

Я намагаюся приєднатись до згадуваних тут рішень, оскільки для переліку є деякі важливі моменти.

  1. Як було сказано у відповіді @ igorw, URL-сховище повинно бути в тому випадку вказане у файлі composer.json, однак, оскільки в обох випадках composer.json повинен існувати (на відміну від 2-го способу @Mike Graf), публікуючи його на Packagist, не так вже й багато (крім того, Github в даний час надає послуги пакетів як npm-пакети), лише різниця замість того, щоб буквально вводити URL-адресу в інтерфейсі пакета, як тільки підписуються.

  2. Більше того, у нього є недолік, що він не може покладатися на зовнішню бібліотеку, яка використовує цей підхід, оскільки рекурсивні визначення сховища не працюють у Composer. Крім того, через це, здається, є "помилка" на ньому, оскільки рекурсивне визначення не вдалося залежно, відновлення сховищ явно в корені, здається, недостатньо, але і всі залежності від пакетів повинні були бути поважним.

З файлом композитора (відповів 18 жовтня 12 о 15:13 igorw)

{
    "repositories": [
        {
            "url": "https://github.com/l3pp4rd/DoctrineExtensions.git",
            "type": "git"
        }
    ],
    "require": {
        "gedmo/doctrine-extensions": "~2.3"
    }
}

Без файлу композитора (відповів 23 січня 1313 о 17:28 Майк Граф)

"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"
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.