Verwenden Sie PHP Composer, um Git Repo zu klonen

111

Ich versuche, mit Composer automatisch ein Git-Repository von Github zu klonen, das nicht in Packagist enthalten ist, aber nicht funktioniert, und ich kann nicht herausfinden, was ich falsch mache.

Ich denke, ich muss es wie folgt in "Repositories" aufnehmen:

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

und dann wahrscheinlich im Abschnitt "erfordern" auflisten. Es sollte diesem Beispiel ähnlich sein, aber es funktioniert nicht. Es gibt nur diesen Fehler:

Ihre Anforderungen konnten nicht in einen installierbaren Satz von Paketen aufgelöst werden.

Hat jemand schon versucht, so etwas zu tun?

Martin
quelle

Antworten:

109

Zum Zeitpunkt des Schreibens im Jahr 2013 war dies eine Möglichkeit, dies zu tun. Composer hat Unterstützung für bessere Möglichkeiten hinzugefügt: Siehe @igorws Antwort

HABEN SIE EIN REPOSITORY?

Git, Mercurial und SVN werden von Composer unterstützt.

HABEN SIE SCHRIFTLICHEN ZUGRIFF AUF DAS REPOSITORY?

Ja?

HAT DAS REPOSITORY A composer.json DATEI

Wenn Sie ein Repository haben, können Sie schreiben in: Hinzufügen eines composer.json Datei hinzu oder reparieren Sie die vorhandene, und verwenden Sie die folgende Lösung NICHT.

Gehen Sie zu @igorws Antwort

VERWENDEN SIE DIES NUR, WENN SIE KEIN REPOSITORY HABEN
ODER WENN DAS REPOSITORY KEIN A HATcomposer.json UND SIE

Dadurch wird alles überschrieben, was Composer möglicherweise aus dem ursprünglichen Repository lesen kann composer.json, einschließlich der Abhängigkeiten des Pakets und des automatischen Ladens.

Durch die Verwendung des packageTyps wird die Last der korrekten Definition auf Sie übertragen. Der einfachere Weg ist, eine zu habencomposer.json Datei im Repository zu haben und sie einfach zu verwenden.

Diese Lösung ist wirklich nur für die seltenen Fälle gedacht, in denen Sie einen abgebrochenen ZIP-Download haben, den Sie nicht ändern können, oder ein Repository, das Sie nur lesen können, das aber nicht mehr gepflegt wird.

"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"
}
Mike Graf
quelle
7
Das VCS-Repository durch ein Paket-Repository zu ersetzen, ist eine schlechte Idee. Das Ziel-Repo hat bereits ein composer.json, verwenden Sie also ein VCS-Repo. Ihr Beispiel unterbricht auch das automatische Laden und ignoriert das branch-alias.
igorw
1
@igorw Kannst du bitte auf diese Informationen verlinken, damit ich und andere den Unterschied verstehen können? Vielen Dank.
Mike Graf
5
Wie auf der Seite "Repositorys" erläutert, muss ein Paket-Repo alle Informationen enthalten. Wenn Sie das autoloadFeld nicht hinzufügen , wird es nicht berücksichtigt. Grundsätzlich müssen Sie alle Informationen aus composer.jsonder Repo-Definition kopieren und einfügen . Das VCS-Repo ruft diese Informationen direkt von VCS ab. Die Vorteile von branch-aliaswerden im Aliase-Dokument und in einem Blog-Beitrag erklärt, den ich geschrieben habe .
igorw
2
Warum wird das immer noch positiv bewertet? In den Composer-Dokumenten wird sogar ausdrücklich angegeben, dass Paket-Repos vermieden werden sollten. Bitte hören Sie auf, schlechte Praktiken zu fördern.
igorw
1
Was empfehlen Sie mir dann zu ändern?
Mike Graf
146

Dieses Paket ist tatsächlich über packagist erhältlich . In diesem Fall benötigen Sie keine benutzerdefinierte Repository-Definition. Stellen Sie einfach sicher, dass Sie eine hinzufügenrequire (die immer benötigt wird) mit einer passenden Versionsbeschränkung .

Wenn ein Paket auf packagist verfügbar ist, fügen Sie kein VCS-Repo hinzu. Es wird die Dinge nur verlangsamen.


Verwenden Sie für Pakete, die nicht über packagist verfügbar sind, a VCS (oder git) Repository, wie in Ihrer Frage gezeigt. Stellen Sie dabei Folgendes sicher:

  • Das Feld "Repositorys" wird in der Datei "root composer.json" angegeben (es handelt sich um ein Nur-Root-Feld, Repository-Definitionen aus erforderlichen Paketen werden ignoriert).
  • Die Definition der Repositorys verweist auf ein gültiges VCS-Repo
  • Wenn der Typ "git" anstelle von "vcs" ist (wie in Ihrer Frage), stellen Sie sicher, dass es sich tatsächlich um ein Git-Repo handelt
  • Sie haben eine requirefür das betreffende Paket
  • Die Einschränkung in requireentspricht den vom VCS-Repo bereitgestellten Versionen. Sie können verwenden composer show <packagename>, um die verfügbaren Versionen zu finden. In diesem Fall ~2.3wäre eine gute Option.
  • Der Name in der requireentspricht dem Namen in der Fernbedienung composer.json. In diesem Fall ist es gedmo/doctrine-extensions.

Hier ist ein Beispiel composer.json, das dasselbe Paket über ein VCS-Repo installiert:

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

Die VCS-Repo-Dokumente erklären dies alles recht gut.


Wenn ein Git-Repository (oder ein anderes VCS-Repository) composer.jsonverfügbar ist, verwenden Sie kein "Paket" -Repo. Bei Paket-Repos müssen Sie alle Metadaten in der Definition angeben und alle in der bereitgestellten Dist und Source vorhandenen Metadaten werden vollständig ignoriertcomposer.json . Sie haben auch zusätzliche Einschränkungen, z. B. dass in den meisten Fällen keine ordnungsgemäßen Aktualisierungen möglich sind.

Vermeiden Sie Paket-Repos ( siehe auch die Dokumentation ).

igorw
quelle
1
Ouu, danke! Ich habe es nicht gefunden, weil ich dachte, es wird nach dem Git Repo DoctrineExtensions aufgerufen.
Martin
2
Schauen Sie sich immer den Namen an composer.json.
igorw
16
-1 Warum ist dies als die richtige Antwort markiert? Es hat das Problem des OP sicher gelöst, aber Clarence und Mike Graf gaben Antworten auf das allgemeinere Problem dahinter. Es ist höchst unwahrscheinlich, dass jemand, der nach einer Möglichkeit sucht, nicht packagistische Projekte einzubeziehen, die DoctrineExtensions einbeziehen möchte.
Aefxx
2
@aefxx Meine Antwort erklärt tatsächlich auch das allgemeine allgemeine Problem, nämlich dass das requireFeld angegeben werden muss.
igorw
6
The VCS repo docs explain all of this quite well.... was?
hek2mgl
47

Sie können das Git-Repository wie folgt in composer.json einfügen:

"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"
}
Edris
quelle
1
Wie in den anderen Antworten oben erläutert: Wenn Sie ein Repository haben, fügen Sie nach composer.jsonMöglichkeit eine Datei hinzu.
Sven
@Sven ... weil es unmöglich ist, ein bestimmtes Commit anders anzugeben?
Cees Timmerman
Vielen Dank für das Teilen, hat mir Stunden gespart :)
Metamaker
Dies ist allgemein angepasst, aber ansonsten im Grunde genommen eine einfache Kopie der Antwort von Mike Graf. Daher bin ich mir nicht sicher, ob allgemein besser ist, als eine bestimmte Bibliothek in der Frage als Beispiel zu sehen.
FantomX1
6

Sagen Sie dem Komponisten einfach, dass er die Quelle verwenden soll, falls verfügbar:

composer update --prefer-source

Oder:

composer install --prefer-source

Dann erhalten Sie Pakete als geklonte Repositorys anstelle von extrahierten Tarballs, sodass Sie einige Änderungen vornehmen und sie zurückschreiben können. Vorausgesetzt, Sie haben Schreib- / Push-Berechtigungen für das Repository und Composer kennt das Repository des Projekts.

Haftungsausschluss: Ich glaube, ich habe eine etwas andere Frage beantwortet, aber das war es, wonach ich gesucht habe, als ich diese Frage gefunden habe. Ich hoffe, dass sie auch für andere nützlich sein wird.

Wenn Composer nicht weiß, wo sich das Repository des Projekts befindet oder das Projekt nicht über die richtige Datei composer.json verfügt, ist die Situation etwas komplizierter, aber andere haben solche Szenarien bereits beantwortet.

Josef Kufner
quelle
3

Ich habe folgenden Fehler festgestellt: The requested package my-foo/bar could not be found in any version, there may be a typo in the package name.

Wenn Sie ein anderes Repo forken, um Ihre eigenen Änderungen vorzunehmen, erhalten Sie ein neues Repository.

Z.B:

https://github.com/foo/bar.git
=>
https://github.com/my-foo/bar.git

Die neue URL muss in Ihren Repositorys-Bereich Ihrer composer.json aufgenommen werden.

Denken Sie daran, dass Sie my-foo/bardas Paket in der composer.jsonDatei in Ihrem neuen Repo umbenennen müssen, wenn Sie sich wie in Ihrem Abschnitt "Erfordernis" auf Ihre Gabel beziehen möchten .

{
    "name":         "foo/bar",

=>

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

Wenn Sie gerade gegabelt haben, können Sie dies am einfachsten direkt in Github bearbeiten.

Henry
quelle
Beachten Sie, dass der Paketname in keiner Weise die URL widerspiegelt, von der aus Sie das Repository lesen können! Es gibt keine automatische Verbindung zwischen den beiden, beide können unabhängig voneinander ausgewählt werden. Die einzige relevante Information in Bezug auf Composer ist der Name, der in das darin enthaltene nameAttribut geschrieben wird composer.json.
Sven
2

In meinem Fall verwende ich Symfony2.3.x und der Parameter für die minimale Stabilität ist standardmäßig "stabil" (was gut ist). Ich wollte ein Repo nicht in packagist importieren, hatte aber das gleiche Problem "Ihre Anforderungen konnten nicht in einen installierbaren Satz von Paketen aufgelöst werden.". Es schien, dass die composer.json in dem Repo, das ich zu importieren versuchte, einen "dev" mit minimaler Stabilität verwendete.

Vergessen Sie also nicht, das zu überprüfen, um dieses Problem zu beheben minimum-stability. Ich habe es gelöst, indem ich eine dev-masterVersion anstelle der masterin diesem Beitrag angegebenen benötigt habe .

Magus
quelle
4
Ich hatte das gleiche Problem, das diskutiert wird hier . Wenn Sie eine explizite Referenz haben (wie ein Git-Commit), können Sie anscheinend so etwas tun "dev-master#4536bbc166ada96ff2a3a5a4b6e636b093103f0e".
Blaskovicz
1

Wenn Sie einen composer.jsonvon GitHub verwenden möchten, sehen Sie sich dieses Beispiel an (im Abschnitt VCS).

Der Paketabschnitt ist für Pakete, die das nicht haben composer.json. Sie sind diesem Beispiel jedoch auch nicht gefolgt, sonst hätte es auch funktioniert. Lesen Sie, was über Paket-Repositorys steht:

Grundsätzlich definieren Sie dieselben Informationen, die im Composer-Repository enthalten sind packages.json, jedoch nur für ein einzelnes Paket. Auch hier sind die minimal erforderlichen Felder Name, Version und entweder dist oder source.

Clarence
quelle
0

Ich versuche, mich den hier erwähnten Lösungen anzuschließen, da einige wichtige Punkte aufgeführt werden müssen.

  1. Wie in der Antwort von @ igorw erwähnt, muss die URL zum Repository in diesem Fall in der Datei composer.json angegeben sein. In beiden Fällen muss jedoch die Datei composer.json vorhanden sein (im Gegensatz zur zweiten Methode, mit der @Mike Graf sie auf dem Packagist veröffentlicht) nicht viel anders (außerdem bietet Github derzeit Paketdienste als npm-Pakete an), nur ein Unterschied, anstatt die URL nach der Anmeldung buchstäblich an der packagist-Oberfläche einzugeben.

  2. Darüber hinaus besteht das Manko, dass es sich nicht auf eine externe Bibliothek verlassen kann, die diesen Ansatz verwendet, da rekursive Repository-Definitionen in Composer nicht funktionieren. Darüber hinaus scheint es einen "Fehler" zu geben, da die rekursive Definition bei der Abhängigkeit fehlgeschlagen ist. Die explizite Angabe der Repositorys im Stammverzeichnis scheint nicht ausreichend zu sein, aber auch alle Abhängigkeiten von den Paketen müssten erneut spezifiziert werden.

Mit einer Komponistendatei (beantwortet am 18. Oktober 12 um 15:13 Uhr)

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

Ohne Komponistendatei (beantwortet am 23. Januar 13 um 17:28 Mike Graf)

"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"
}
FantomX1
quelle