Komponist: Wie kann ich eine andere Abhängigkeit installieren, ohne alte zu aktualisieren?

196

Ich habe ein Projekt mit einigen Abhängigkeiten und möchte ein anderes installieren, aber ich möchte die anderen so lassen, wie sie sind. Also habe ich das bearbeitet composer.json, aber wenn ich laufe composer install, bekomme ich folgende Ausgabe:

Installing dependencies from lock file
Warning: The lock file is not up to date with the latest changes in composer.json. You may be getting outdated dependencies. Run update to update them.
Your requirements could not be resolved to an installable set of packages.

Problem 1
    - laravel/framework dev-master requires ext-mcrypt * -> the requested PHP extension mcrypt is missing from your system.
    - laravel/framework dev-master requires ext-mcrypt * -> the requested PHP extension mcrypt is missing from your system.
    - Installation request for laravel/framework dev-master -> satisfiable by laravel/framework dev-master.

Zuallererst habe ich mcrypt installiert, deshalb weiß ich nicht, warum es sich dort darüber beschwert.

Wie kann ich diese neue Abhängigkeit installieren?

Mein Komponist.json:

{
    "require": {

        "opauth/opauth": "*",
        "opauth/facebook": "*",
        "opauth/google": "*",
        "opauth/twitter": "*",

        "imagine/Imagine": "dev-develop",

        "laravel/framework": "4.*",
        "loic-sharma/profiler": "dev-master"
    },
    "autoload": {
        "classmap": [
            "app/libraries",
            "app/commands",
            "app/controllers",
            "app/models",
            "app/database/migrations",
            "app/tests/TestCase.php"
        ]
    },
    "minimum-stability": "dev"
}
Dualität_
quelle
1
Die mcrypt-Warnung könnte von mehreren PHP-Installationen stammen. Die PHP mit der Erweiterung mcrypt ist möglicherweise nicht dieselbe Installation wie Ihre PHP-CLI
Matthemattics

Antworten:

293

Um ein neues Paket zu installieren und nur das, haben Sie zwei Möglichkeiten:

  1. requireFühren Sie mit dem Befehl einfach Folgendes aus:

    composer require new/package
    

    Composer errät die beste zu verwendende Versionsbeschränkung, installiert das Paket und fügt es hinzu composer.lock.

    Sie können auch eine explizite Versionsbeschränkung angeben, indem Sie Folgendes ausführen:

    composer require new/package ~2.5
    

-ODER-

  1. Fügen Sie mit dem updateBefehl das neue Paket manuell hinzu composer.jsonund führen Sie dann Folgendes aus:

    composer update new/package
    

Wenn sich Composer beschwert und angibt, dass Ihre Anforderungen nicht in einen installierbaren Satz von Paketen aufgelöst werden konnten, können Sie dies beheben, indem Sie das Flag übergeben --with-dependencies . Dadurch werden alle Abhängigkeiten des Pakets, das Sie installieren / aktualisieren möchten, auf die Whitelist gesetzt (jedoch keine Ihrer anderen Abhängigkeiten).

Bezüglich der Probleme des Fragestellers mit Laravel und mcrypt: Überprüfen Sie, ob es in Ihrer CLI php.ini ordnungsgemäß aktiviert ist. Wenn php -mmcrypt nicht aufgelistet ist, fehlt es.

Wichtig: Vergessen Sie nicht, new/packagebei der Verwendung anzugeben composer update! Wenn Sie dieses Argument weglassen, werden alle Abhängigkeiten sowie composer.lockaktualisiert.

Seldaek
quelle
3
Ich habe die Meldung "Das für das Update aufgelistete Paket [...] wurde nicht installiert. Ignorieren" erhalten.
Gerry
11
Das funktioniert bei mir nicht. Mir wurde gesagt, dass das für das Update aufgeführte Paket "x / y" nicht installiert ist. Ignorieren. "Und dann geht es darum, alles zu aktualisieren. Also installiert es nicht das neue Paket, das ich will, und es aktualisiert alles andere, was genau das Gegenteil von dem ist, was ich will.
tremby
3
Es funktioniert einfach nicht. "Ihre Anforderungen konnten nicht in einen installierbaren Satz von Paketen aufgelöst werden." (und Text über einige alte Pakete, die überhaupt nicht in Beziehung stehen, nach denen ich frage) Wenn ich frage, aktualisieren Sie einfach ein Paket.
OZ_
@tremby Funktioniert hier einwandfrei. Vielleicht haben Sie vergessen, "new/package" : "*",im "require"Abschnitt composer.json hinzuzufügen ?
Potherca
@OZ_ Auch wenn nur eine Abhängigkeit installiert werden soll, muss sie zuerst aufgelöst werden , um sicherzustellen, dass sie nicht mit Ihren anderen Abhängigkeiten in Konflikt steht.
Potherca
30

Eigentlich ist die richtige Lösung:

composer require vendor/package

Entnommen aus der CLI-Dokumentation für Composer :

Der requireBefehl fügt der composer.jsonDatei aus dem aktuellen Verzeichnis neue Pakete hinzu .

php composer.phar require

Nach dem Hinzufügen / Ändern der Anforderungen werden die geänderten Anforderungen installiert oder aktualisiert.

Wenn Sie Anforderungen nicht interaktiv auswählen möchten, können Sie sie einfach an den Befehl übergeben.

php composer.phar require vendor/package:2.* vendor/package2:dev-master

Zwar werden composer updateneue Pakete in composer.json installiert, doch werden auch die Datei composer.lock und alle installierten Pakete gemäß der Fuzzy-Logik ( >oder *Zeichen nach den Doppelpunkten) in composer.json aktualisiert ! Dies kann durch die Verwendung vermieden werden composer update vendor/package, aber ich würde nicht empfehlen, es sich zur Gewohnheit zu machen, da Sie ein vergessenes Argument von einem möglicherweise kaputten Projekt entfernt sind…

Halten Sie die Dinge gesund und bleiben Sie dabei, composer require vendor/packageum neue Abhängigkeiten hinzuzufügen! 😉

Matthemattics
quelle
Aber wird composer requiredie Datei composer.lock mit aktualisiert?
Phil
2

Mein Anwendungsfall ist einfacher und passt einfach zu Ihrem Titel, aber nicht zu Ihrem weiteren Detail.

Das heißt, ich möchte ein neues Paket installieren, das sich noch nicht in meinem befindet, composer.jsonohne alle anderen Pakete zu aktualisieren.

Die Lösung hier ist composer require x/y

tremby
quelle
1

In meinem Fall hatte ich ein Repo mit:

  • Anforderungen A, B, C, D in .json
  • aber nur A, B, C in der .lock

In der Zwischenzeit hatten A, B, C neuere Versionen in Bezug auf die Erzeugung der Sperre.

Aus irgendeinem Grund habe ich die "Anbieter" gelöscht und wollte eine composer installund schlug mit der Nachricht fehl:

Warning: The lock file is not up to date with the latest changes in composer.json.
You may be getting outdated dependencies. Run update to update them.
Your requirements could not be resolved to an installable set of packages.

Ich habe versucht, die Lösung von Seldaek aus auszuführen, indem ich eine herausgab, composer update vendorD/libraryDaber der Komponist bestand darauf, mehr Dinge zu aktualisieren.lock hatte auch mein Git-Tool Änderungen vorgenommen.

Die Lösung, die ich verwendete, war:

  1. Löschen Sie alle vendors Verzeichnis.
  2. Entfernen Sie die Anforderung vorübergehend VendorD/LibraryD aus dem .json.
  3. Lauf composer install .
  4. Dann löschen Sie die Datei .json und checken Sie sie erneut aus dem Repo aus (entspricht dem erneuten Hinzufügen der Datei, wobei jedoch mögliche Änderungen an Leerzeichen vermieden werden).
  5. Führen Sie dann die Lösung von Seldaek aus composer update vendorD/libraryD

Es hat die Bibliothek installiert, aber zusätzlich git mir diff gezeigt, dass .locknur die neuen Dinge hinzugefügt wurden, ohne die anderen zu bearbeiten.

(Danke Seldaek für den Zeiger;))

Xavi Montero
quelle
Das ist ein Overkill. Löschen Sie einfach die Sperrdatei und führen Sie die Composer-Installation aus. es funktioniert
Astroanu
6
Dies gilt auch für Nicht-Pro-Umgebungen, in denen Sie die Abhängigkeiten problemlos neu erstellen können. Wenn etwas kaputt geht, können Sie es beheben. Wenn für Sie Serverausfälle bedeuten, dass Sie 10.000 US-Dollar pro Stunde verlieren, dann zweifeln Sie nicht daran, dass die Server composer.lockniemals glücklich gelöscht und neu erstellt werden sollten. .lockist ... zum Verriegeln !! ; D - Andernfalls wäre die Sperrdatei nutzlos und Sie würden sie nicht festschreiben oder sie würde überhaupt nicht existieren. Wenn Sie in einem qualitätsorientierten Unternehmen arbeiten und eine Sperre mit beispielsweise 1.000 Abhängigkeiten neu erstellen und festlegen, ändern sich alle und QS-Mitarbeiter werden Sie umbringen, hahaha.
Xavi Montero
2
Hey @astroanu, nur um zu verdeutlichen, dass, wenn Sie eine Abhängigkeit zu einem früheren Zeitpunkt installiert haben und ein Teil der Abhängigkeit die neueste Version von dev master abgerufen hat, es erhebliche Probleme geben kann, einfach die composer.lock zu löschen und einfach auf install zu klicken. Wenn Sie noch keine Gelegenheit hatten, die Auswirkungen der Einführung einer Abhängigkeit zu überprüfen, besteht die Möglichkeit unerwarteter Ergebnisse und möglicherweise eine schlechte Benutzererfahrung.
dkcwd
Das Löschen der Sperrdatei und das Ausführen von install / update oder das Ausführen von update, auch ohne Löschen der Sperrdatei, wirkt sich natürlich auf die Stabilität der Anwendungen aus. Das Composer-Update sollte nur in der Entwicklungsumgebung ausgeführt werden. Verwenden Sie in der Produktion immer die Composer-Installation, da der Produktions-Build anhand der in der Sperrdatei gespeicherten Daten getestet wird.
Astroanu