2015-05-14 5 views
7

Immer wenn ich versuche, ein neues Paket mit Composer wie "composer require packagename/package" oder "composer.phar update" hinzuzufügen, bekomme ich alle installierten Pakete aktualisiert. Gibt es eine Option in Composer, um einige Pakete auszuschließen, die ich nicht aktualisiert bekommen muss?Ein Paket von der Aktualisierung in Composer ausschließen

Antwort

1

Wenn Sie das Bedürfnis haben, einige Ihrer Pakete von der Aktualisierung auszuschließen, betrachte ich dies als den Anfang, in ein Abhängigkeits-Chaos zu geraten. Sie sollten jetzt Ihre Abhängigkeiten aufräumen, bevor es schlimmer wird.

Aus meiner Erfahrung besteht der oberste Grund, eine Abhängigkeit nicht aktualisieren zu wollen, wenn Sie einen Zweig eines Pakets anstelle einer freigegebenen Version verwendet haben. Sie sollten versuchen, dies so gründlich wie möglich zu beheben:

  • Wenn Sie Ihre eigenen Pakete verwenden, markieren Sie eine Release-Version für die Commits, die Sie verwenden möchten. Wechseln Sie dann Ihre Software, um entweder die genaue Version zu verwenden, oder verwenden Sie eine Platzhalterversionsanforderung wie 1.0.*, ~1.2 oder ^1.3.4.
  • Wenn Sie externen Code verwenden, den Sie nicht direkt beeinflussen können, wenden Sie sich an die Entwickler dieses Codes, und bitten Sie sie, eine Version zu kennzeichnen. Das Markieren von Versionen ist wichtig, um eine vernünftige Abhängigkeitsstruktur zu erhalten.
  • Wenn Sie nicht die externen Entwickler markieren eine Version machen können, einen Weg finden, es selbst zu markieren:
    • Clone ihre Repository auf Github, markieren eine Version, und geben Sie Ihre Kopie des Repository statt packagist .org.
    • Erstellen Sie die erforderlichen Metadaten in einem "type = Paket" Repository-Eintrag in Ihrer composer.json Datei.
    • Oder zumindest, wenn sie auf dem Zweig je eine Version Alias ​​zuweisen für einen sanfteren Übergang später zu ermöglichen, wenn das externe Projekt ihre Versionen beginnt Tagging.Beachten Sie, dass dies Ihre aktuellen Probleme nicht beheben wird, aber es könnte die Dinge in Zukunft verbessern.
  • Wenn alles andere fehlschlägt, könnten Sie auf eine bestimmte Commit-ID in Ihrem composer.json zeigen. Dies wird
  • Im Allgemeinen sollten Sie immer composer update bedingungslos ausführen können. Wenn nicht, ist dies ein Warnzeichen für Abhängigkeiten, die in Ihrer eigenen Datei composer.json nicht korrekt deklariert sind.

    Der zweite Grund, warum man nicht updaten möchte, sind inkompatible Änderungen in einem Paket, die als Bug-Fix anstatt einer größeren Version markiert wurden. Die Lösung dafür wäre einfach:

    • Zuerst müssten Sie den Grund für einen solchen Fehler untersuchen: War es wirklich eine inkompatible API-Änderung? Wenn ja, melde ein Problem mit den Entwicklern dieses Pakets. Sie sollten eine neue Fehlerbehebungsversion erstellen, bei der das inkompatible Update zurückgesetzt oder behoben wird. Wenn sie ihre Änderung behalten möchten, sollten sie sie mit einem kleineren oder größeren Versionsinkrement versehen, je nachdem, was sie geändert haben.
    • Wenn Sie jedoch ihren Code falsch verwendet haben und die öffentliche API irgendwie nicht verwenden, ist eine Fehlerbehebung unwahrscheinlich. Sie sollten versuchen, Ihren Code zu reparieren, indem Sie keine Inhalte verwenden, die nicht die öffentliche API sein sollen. In den letzten Versionen von Symfony ist beispielsweise die öffentliche API explizit im Code und in der Dokumentation markiert. Wenn Sie etwas anderes verwenden, wird dies irgendwann auch dann nicht mehr passieren, wenn Sie "kompatible" Versionsupdates von 2.6.x bis 2.7.x durchführen.
    • Eine andere Möglichkeit, es zu beheben wäre, die neuere Version innerhalb der composer.json Datei auszuschließen: Anstelle von "external/package":"~1.2" würden Sie "external/package":"~1.2,!1.2.5" setzen, wenn Sie feststellen, dass Version 1.2.5 Ihre Software kaputt gemacht hat. Oder vielleicht haben Sie Angst vor weiteren Updates, die auch Ihre Software kaputt machen, die Sie in "external/package":"~1.2,!>=1.2.5" setzen würden.
    • Eine weitere Sache hinzuzufügen: Wenn Sie composer require ausführen, erhalten Sie keine Updates für Pakete, die bereits installiert sind. Sie sind behoben. Das erforderliche Paket wird basierend auf allen installierten Versionen ausgewählt. Es wird nur installiert, wenn eine Version verfügbar ist, die mit allen bereits installierten Versionen kompatibel ist. Beachten Sie, dass dies nicht korrekt funktioniert, wenn Abhängigkeiten zu den Zweigen von Paketen in Ihrem eigenen composer.json und dem neuen Paket bestehen. Der Grund dafür ist, dass der Name des Zweigs derselbe ist, aber Sie werden nie wissen, welches Commit verwendet wurde. Vielleicht verwendet das neue Paket ein sehr aktuelles Commit von dev-master eines dritten Pakets, und Ihre eigene Software ist eine sehr alte, und es gab inkompatible Änderungen dazwischen - das wird Dinge kaputt machen, ohne dass der Composer es erkennen kann.

    +0

    Und was ist, wenn die Paketversion "dev-master" ist? wird sowas wie "external/package": "~ dev-master,!> = 1.2.5" funktionieren? – user7282

    +0

    Es gibt berechtigte Gründe, ein Paket auszuschließen! Zum Beispiel entwickle ich eine Bibliothek, und ich sollte meine laufenden Arbeiten an einem Feature-Zweig testen. Also brauche ich eine App, die mit Abhängigkeiten auf dem neuesten Stand ist, aber meine Bibliothek in Ruhe lässt. – joachim

    +0

    Wenn Sie eine Umgebung (eine App) benötigen, um Ihre Bibliothek zu testen, führen Sie Ihre Tests wahrscheinlich falsch durch. Eine Bibliothek sollte eigenständig getestet werden können, ohne in andere Software integriert zu sein. Sie sollten jedoch in der Lage sein, Ihren lib's Zweig zu benötigen - und Sie können auch direkt ein lokales Repository als Abhängigkeitsquelle hinzufügen, so dass Sie die Bibliothek ein wenig trennen können, sie aber in Ihrer App zum Testen haben. – Sven

    2

    Mit composer require packagename/package benötigen Sie ein neues Paket und Sie erhalten ein partielles Update für nur packagename/package und seine Abhängigkeiten.

    composer update packagename/package kann verwendet werden, um die gleiche Teilupdate auszulösen, aber dann, wenn Sie bereits packagename/package in Ihrem composer.json haben.

    +0

    Was ich brauche, ist ein oder zwei Pakete auszuschließen und alle anderen zu aktualisieren – user7282

    4

    können Sie liefern den Namen (s) eines ein oder mehrere Pakete zu aktualisieren:

    composer update vendor1/package1 vendor1/package2 vendor2/* 
    

    und dies wird nur die Pakete aktualisieren.

    Dies ist nicht ausdrücklich ausgeschlossen, es umfasst, aber es macht sicherlich das Aktualisieren bestimmter Pakete viel schneller.

    Um die Aktualisierung mit dem Befehl require zu vermeiden, könnten Sie die composer.json von Hand erstellen (was nicht so schwer ist), dann führen Sie das oben genannte Update auf dem Paket, das Sie gerade hinzugefügt haben.

    Verwenden Sie auch --no-dev zum Ausschließen von Entwicklungspaketen (wenn Sie die Pakete nicht entwickeln, auf die Sie beispielsweise in der Produktion angewiesen sind). Dies beschleunigt auch die Abhängigkeitsanalyse.

    +0

    Die meiste Zeit möchte ich ein oder zwei Pakete ausschließen und alle anderen aktualisieren. Ist es möglich? – user7282

    +0

    Ich kenne keine Ausschlussmethode, aber Sie könnten eine Befehlszeile mit allen Ihren gewünschten Paketen vorformatieren: 'Composer Update Vendor/Paket1 Vendor/Package2 Vendor2/*' und einfach diesen Befehl irgendwo griffbereit halten. – scipilot

    +0

    Aber ich werde einige 10 - 20 Pakete haben, die im Laufe der Zeit zunehmen werden, während jene, die ausgeschlossen werden müssen, weniger sein werden. Es wäre daher schwierig, Pakete zu verfolgen, die aktualisiert werden müssen. – user7282

    9
    1. Lauf dieser Befehl und sehen, was Ihr Paket Version:

      composer show -i 
      
    2. gehen zu composer.json und zu bearbeiten, welches Paket Sie nie Version von composer update und schreiben korrekt für das ändern wollen:

      "jacopo/laravel-authentication-acl": "1.3.*", 
      

      ändern zu:

      "jacopo/laravel-authentication-acl": "1.3.11", 
      

    Fertig! Jetzt, wenn Sie composer update ausführen, wird dieses Paket nicht aktualisiert.

    +0

    Was ist, wenn die Version gesperrt ist" dev-master "und Sie bleiben wollen mit deiner aktuellen Installation? –

    +0

    Für dev-master können Sie etwas tun wie: 'Composer show -i'then' "nahid/linkify": "dev-master # 0c4e58f" ' –

    0

    Eine Abhilfe ist replace property zu verwenden, jedoch ist es für die nicht dedizierter Befehl, so dass Sie composer require foo/bar wie gewohnt ausgeführt werden können (die composer.json schaffen wird), dann einen neuen replace Abschnitt für das Paket zu ignorieren hinzufügen.

    Oder erstellen Sie composer.json Datei auf eigene Faust. Hier ist das Beispiel:

    { 
        "require": { 
         "radic/tmp-underscore-php": "1.2.0" 
        }, 
        "replace": { 
         "patchwork/utf8": "*" 
        } 
    } 
    

    Sobald Sie laufen composer install, das erforderliche Paket patchwork/utf8 nicht heruntergeladen werden.

    2

    Aus meiner Erfahrung ist der beste Weg, 1 oder einige Pakete auszuschließen, --interactive in Composer-Update zu verwenden.

    $ composer update --interactive 
    

    Wenn Sie dies tun können Sie auswählen, welches Paket Sie wollen das Paket zu aktualisieren und überspringen, die Sie nicht wollen, zu aktualisieren.

    Verwandte Themen