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
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:
1.0.*
, ~1.2
oder ^1.3.4
.- 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.
composer.json
zeigen. Dies wirdIm 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.
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.
Was ich brauche, ist ein oder zwei Pakete auszuschließen und alle anderen zu aktualisieren – user7282
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.
Die meiste Zeit möchte ich ein oder zwei Pakete ausschließen und alle anderen aktualisieren. Ist es möglich? – user7282
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
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
Lauf dieser Befehl und sehen, was Ihr Paket Version:
composer show -i
gehen zu
composer.json
und zu bearbeiten, welches Paket Sie nie Version voncomposer 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.
Was ist, wenn die Version gesperrt ist" dev-master "und Sie bleiben wollen mit deiner aktuellen Installation? –
Für dev-master können Sie etwas tun wie: 'Composer show -i'then' "nahid/linkify": "dev-master # 0c4e58f" ' –
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.
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.
- 1. Composer spezifische Versionen ausschließen
- 2. PHP Composer Paket Anmeldeinformationen
- 3. Composer-Paket nach Zweigstelle
- 4. Ausschließen bestimmter Ansichten mit Laravel View Composer
- 5. Laravel verwenden nicht Composer-Paket
- 6. Composer/Laravel: Wie man ein bestimmtes Paket hinzufügt/aktualisiert
- 7. Automatisches Einschließen der Datei in ein Paket, wenn sie als Abhängigkeit in Composer enthalten ist
- 8. Ein Top-Level-Verzeichnis aus einem setuptools-Paket ausschließen
- 9. Wie erhalten Sie den Composer, um ein nicht-Composer-Paket zu installieren?
- 10. Maven War Plugin archiveClasses, aber ein Paket ausschließen
- 11. Kann kein Non-Laravel Composer-Paket laden
- 12. First Composer Paket - Autoloader funktioniert nicht
- 13. Mehmall-Composer-Paket mit Laravel 4 - Howto?
- 14. Wie schließe ich ein Composer-Paket in ein einfaches PHP ein?
- 15. Datensätze aus R-Paket-Build ausschließen
- 16. Verwenden Sie eine Paket-Verzweigung in einer Composer-Abhängigkeit
- 17. Java-Paket vom Abhängigkeits-Jar ausschließen
- 18. Verwendung von SimpleSAMLphp in Symfony mit Composer
- 19. Kein Hinzufügen von HTML-Paket zu Laravel mit Composer
- 20. Laravel Update von Composer
- 21. Funktion aus R-Paket-Handbuch ausschließen
- 22. Ausschließen von Unterverzeichnissen in tsconfig.json
- 23. Wie kann man Assets aus einem NPM-basierten Paket in einem PHP-Composer-basierten Paket laden?
- 24. ausschließen Pakete von proguard
- 25. ein- und ausschließen in Aktivitätsdiagramm
- 26. Wie installiere ich tinymce Paket mit Composer in Laravel
- 27. Composer installiert nur Pakete mit manueller Aktualisierung auf JSON-Datei
- 28. Kann ich einen alternativen Lieferantenzielordnerpfad für ein Composer-Paket von GitHub festlegen?
- 29. Ausschließen der Konfiguration in Testklassen von @ComponentScan
- 30. Aktualisierung der Richtlinientabelle bei Aktualisierung der Bereichseigenschaften
Und was ist, wenn die Paketversion "dev-master" ist? wird sowas wie "external/package": "~ dev-master,!> = 1.2.5" funktionieren? – user7282
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
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