Wie kann ein bestimmtes Commit in Composer korrekt benötigt werden, damit es für abhängige Pakete verfügbar ist?

108

Ich habe eine Bibliothek, foo/foo-libdie requiresein bestimmtes Commit von GitHub hat:

{
    "name": "foo/foo-lib",
    "repositories": [
        {
            "type": "vcs",
            "url": "https://github.com/KnpLabs/Gaufrette.git"
        }
    ],
    "require": {
        "knplabs/gaufrette": "dev-master#2633721877cae79ad461f3ca06f3f77fb4fce02e"
    }
}

und es funktioniert gut:

$ composer update
Loading composer repositories with package information
Updating dependencies (including require-dev)                                 
  - Updating knplabs/gaufrette dev-master (2633721 => 2633721)
    Checking out 2633721877cae79ad461f3ca06f3f77fb4fce02e

Generating autoload files

aber wenn ich diese Bibliothek in einem anderen Projekt benötige:

{
    "name": "bar/bar-app",
    "repositories": [
        {
            "type": "vcs",
            "url": "ssh://git.example.com/foo-lib"
        }
    ],
    "require-dev": {
        "foo/foo-lib": "dev-master"
    }
}

es ergibt einen Abhängigkeitsfehler:

Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - Installation request for foo/foo-lib dev-master -> satisfiable by foo/foo-lib[dev-master].
    - foo/foo-lib dev-master requires knplabs/gaufrette dev-master#2633721877cae79ad461f3ca06f3f77fb4fce02e -> no matching package found.

Meine Frage lautet also: Wie kann ich requiredas spezifische Commit von GitHub in meiner Bibliothek korrekt korrigieren, damit es in abhängigen Paketen verfügbar ist?

Maciej Sz
quelle
3
Beachten Sie, dass der Komponist bei der Anforderung eines Commits diese Commit-Anforderungen nicht berücksichtigt (cmoposer.json). Stattdessen wird die Verzweigungskopfanforderung berechnet, die sich im Laufe der Zeit ändert. Das könnte also eine Weile funktionieren, wird aber in Zukunft sicher brechen.
Estani

Antworten:

157

Sie müssen die Gaufrette-Bibliothek an diesem Hash mit einem devFlag sowohl in Ihrer Bibliothek als auch in Ihrer Anwendung explizit anfordern . So etwas sollte in der Anwendung funktionieren composer.json:

{
    "name": "bar/bar-app",
    "repositories": [
        {
            "type": "vcs",
            "url": "ssh://git.example.com/foo-lib"
        }
    ],
    "require-dev": {
        "foo/foo-lib": "dev-master",
        "knplabs/gaufrette": "dev-master#2633721877cae79ad461f3ca06f3f77fb4fce02e"
    }
}

Aus der Dokumentation :

Wenn eine Ihrer Abhängigkeiten von einem instabilen Paket abhängig ist, müssen Sie diese zusammen mit dem Flag für ausreichende Stabilität ebenfalls explizit anfordern.

In der Dokumentation wird außerdem vorgeschlagen, dass Sie das Repository für Gaufrette in Ihre bar/bar-appComposer-Datei aufnehmen müssen, obwohl dies in diesem Fall anscheinend nicht erforderlich war. Ich bin mir nicht sicher warum.

Chris
quelle
Ich habe das schon versucht, funktioniert auch nicht. Ich denke, es könnte etwas damit zu tun haben, dass Composer Packagist gegenüber GitHub bevorzugt.
Maciej Sz
Nein, ich habe mich bei meinen lokalen Repositorys erkundigt - es handelt sich nicht um ein GitHub-spezifisches Problem.
Maciej Sz
Ich bin mir ziemlich sicher, dass ich das schon einmal zum Laufen gebracht habe. Was ist, wenn Sie "minimum-stability": "dev"die bar/bar-appAnforderungen ergänzen ?
Chris
3
Es sieht so aus, als müssten Sie Gaufrette explizit für diesen Hash sowohl in Ihrer Bibliothek als auch in Ihrer Anwendung benötigen. "Wenn eine Ihrer Abhängigkeiten von einem instabilen Paket abhängig ist, müssen Sie diese zusammen mit dem Flag für ausreichende Stabilität ebenfalls explizit anfordern." Beachten Sie, dass Sie einige Pakete, z. B. Gaufrette, devstabil und standardmäßig stablefür alles andere verwenden können.
Chris
2
Es sieht so aus, als würde GitHub von Composer sofort unterstützt - ich habe gerade das "url": "https://github.com/KnpLabs/Gaufrette.git"erste Paket entfernt und es funktioniert immer noch.
Maciej Sz
15

So machen Sie es in der Kommandozeile:

composer update knplabs/gaufrette:dev-master#2633721 --with-dependencies

Sie müssen nicht den gesamten Hash verwenden, ein sieben Zeichen langer Hash scheint den Trick zu lösen. Wie oben erwähnt, muss Ihr Projekt dev unterstützen - worüber es sich beschwert, wenn es nicht bereits festgelegt ist. Verwenden --with-dependenciesSie diese Option auch, um Abhängigkeiten von der zu aktualisierenden zu erhalten.

powpow12
quelle
0

Wenn Sie Änderungen für ein Git-Repository durch Forking vornehmen, stellen Sie sicher, dass Sie die Option verwenden. Der Paketname ist tatsächlich in der paketeigenen Datei composer.json definiert - obwohl ich das Paket auf mein eigenes joshuapaling-Github-Konto aufgeteilt habe, und Das Paket befand sich jetzt unter der URL https://github.com/joshuapaling/Cake-Resque.git , die den Namen des Pakets aus Komponistenperspektive überhaupt nicht beeinflusst hatte.

Ein dummer Fehler - aber ich bin neu im Komponisten und es war zunächst nicht klar! Ich hoffe also, dass dies jemand anderem mit dem gleichen Problem hilft.

Gayan Kalhara
quelle