Jak poprawnie wymagać określonego zatwierdzenia w Composerze, aby było dostępne dla pakietów zależnych?

108

Mam bibliotekę, foo/foo-libktórej requireskonkretny commit z GitHub:

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

i działa dobrze:

$ 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

ale kiedy potrzebuję tej biblioteki w innym projekcie:

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

daje błąd zależności:

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.

Więc moje pytanie brzmi: jak poprawnie wykonać requirekonkretny commit z GitHub w mojej bibliotece, aby był dostępny w pakietach zależnych?

Maciej Sz
źródło
3
Należy pamiętać, że gdy wymaga się zatwierdzenia, kompozytor nie będzie honorował wymagań dotyczących zatwierdzenia (cmoposer.json). Zamiast tego oblicza wymaganie dotyczące głowicy gałęzi, które będzie się zmieniać w czasie. Może to działać przez chwilę, ale na pewno się zepsuje w przyszłości.
estani

Odpowiedzi:

157

Będziesz musiał jawnie wymagać biblioteki Gaufrette w tym skrócie, z devflagą, zarówno w swojej bibliotece, jak iw aplikacji. Coś takiego powinno działać w aplikacji 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"
    }
}

Z dokumentacji :

Jeśli jedna z twoich zależności jest zależna od niestabilnego pakietu, musisz jawnie tego wymagać, wraz z odpowiednią flagą stabilności.

Dokumentacja sugeruje również, że będziesz musiał dołączyć repozytorium dla Gaufrette do bar/bar-apppliku Composer, chociaż brzmi to tak, jakby nie było to konieczne w tym przypadku. Nie wiem dlaczego.

Chris
źródło
Już tego próbowałem, ale też nie działa. Myślę, że może to mieć coś wspólnego z tym, że Composer preferuje Packagist zamiast GitHub?
Maciej Sz
Nie, sprawdziłem w moich lokalnych repozytoriach - to nie jest problem związany z GitHubem.
Maciej Sz
Jestem prawie pewien, że już wcześniej to zadziałało. Co jeśli dodasz "minimum-stability": "dev"do bar/bar-appwymagań?
Chris,
3
To wygląda jak masz zamiar trzeba wyraźnie wymagają gaufrette w tym hash zarówno biblioteki i aplikacji. „Jeśli jedna z Twoich zależności jest zależna od niestabilnego pakietu, musisz wyraźnie jej wymagać, wraz z odpowiednią flagą stabilności”. Zauważ, że możesz mieć kilka pakietów, np. Gaufrette, ze devstabilnością i domyślnie stabledla wszystkiego innego.
Chris,
2
Wygląda na to, że GitHub jest obsługiwany przez Composera po wyjęciu z pudełka - właśnie usunąłem "url": "https://github.com/KnpLabs/Gaufrette.git"z pierwszego pakietu i nadal działa.
Maciej Sz
15

Oto jak to zrobić w linii poleceń:

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

Nie musisz używać całego hasha, siedem znaków wydaje się być sztuczką. Jak wspomniano powyżej, Twój projekt będzie musiał wspierać programistów - na co będzie narzekać, jeśli nie jest jeszcze ustawiony. Użyj również, --with-dependenciesaby uzyskać wszelkie zależności aktualizowanego.

powpow12
źródło
0

Jeśli wprowadzasz zmiany w repozytorium Git przez rozwidlenie, upewnij się, że używasz nazwy pakietu jest faktycznie zdefiniowana we własnym pliku composer.json pakietu - więc nawet jeśli rozwidliłem pakiet na moje własne konto joshuapaling github i pakiet znajdował się teraz pod adresem URL https://github.com/joshuapaling/Cake-Resque.git , co w ogóle nie wpłynęło na nazwę pakietu z perspektywy kompozytorów.

Głupi błąd - ale jestem nowym kompozytorem i na początku nie było to jasne! Mam więc nadzieję, że pomoże to komuś innemu z tym samym problemem.

Gayan Kalhara
źródło