Ich bin ein wenig verwirrt mit der composer.lock
Verwendung in einer Anwendung mit einem Repository.
Ich sah viele Leute sagen, dass wir nicht .gitignore
composer.lock
aus dem Repository sollten.
Wenn ich meine Bibliotheken in meiner Entwicklungsumgebung aktualisiere, werde ich eine neue haben, composer.lock
aber ich kann sie nicht in die Produktion aktualisieren, oder?
Wird es nicht zu Konflikten in dieser Datei kommen?
git
version-control
composer-php
Pierre de LESPINAY
quelle
quelle
Antworten:
Wenn Sie Ihre Bibliotheken aktualisieren, möchten Sie auch die Sperrdatei festschreiben. Grundsätzlich heißt es, dass Ihr Projekt an die spezifischen Versionen der von Ihnen verwendeten Bibliotheken gebunden ist.
Wenn Sie Ihre Änderungen festschreiben und jemand Ihren Code abruft und die Abhängigkeiten aktualisiert, sollte die Sperrdatei unverändert bleiben. Wenn es geändert wird, bedeutet dies, dass Sie eine neue Version von etwas haben.
Wenn Sie es im Repository haben, können Sie sicher sein, dass jeder Entwickler dieselben Versionen verwendet.
quelle
composer install
die aus der Sperrdatei lesen und nichts ändern.Für Anwendungen / Projekte : Auf jeden Fall ja.
In der Dokumentation des Komponisten heißt es dazu (mit Schwerpunkt):
Wie @meza sagte: Sie sollten die Sperrdatei festschreiben, damit Sie und Ihre Mitarbeiter an denselben Versionen arbeiten und verhindern, dass Sie sagen: "Aber es hat auf meinem Computer funktioniert". ;-);
Für Bibliotheken : Wahrscheinlich nicht.
In der Dokumentation des Komponisten finden Sie Hinweise zu diesem Thema:
Und sagt hier :
Für Bibliotheken stimme ich der Antwort von @Josh Johnson zu.
quelle
Nachdem ich es für einige Projekte in beide Richtungen getan habe, bin ich der Meinung, dass dies
composer.lock
nicht als Teil des Projekts festgelegt werden sollte.composer.lock
Es werden Metadaten erstellt, die nicht Teil des Projekts sind. Der Status von Abhängigkeiten sollte durch die Versionierung (entweder manuell oder als Teil Ihres automatisierten Erstellungsprozesses) und nicht willkürlich vom letzten Entwickler gesteuert werden, der sie aktualisiert und die Sperrdatei festschreibt.Wenn Sie befürchten, dass sich Ihre Abhängigkeiten zwischen Composer-Updates ändern, haben Sie kein Vertrauen in Ihr Versionsschema. Versionen (1.0, 1.1, 1.2 usw.) sollten unveränderlich sein und Sie sollten Platzhalter "dev-" und "X. *" außerhalb der anfänglichen Feature-Entwicklung vermeiden.
Das Festschreiben der Sperrdatei ist eine Regression für Ihr Abhängigkeitsverwaltungssystem, da die Abhängigkeitsversion nun wieder implizit definiert wurde.
Außerdem sollte Ihr Projekt niemals neu erstellt werden müssen oder seine Abhängigkeiten in jeder Umgebung, insbesondere bei Produkten, neu erfasst werden müssen. Ihr Ergebnis (tar, zip, phar, ein Verzeichnis usw.) sollte unveränderlich sein und durch Umgebungen beworben werden, ohne sich zu ändern.
quelle
composer.json
denen die erforderlichen Versionen expliziter angegeben sind. Wenn Sie jedoch keine bestimmten Versionen festlegen, sollten Sie die festschreibencomposer.lock
. Es ist verwirrend, wenn sich die in angegebenen Versionen von den gemäß acomposer.json
installierten unterscheidencomposer.lock
. Es hängt auch von der App (Inhouse- oder General Release) und ihrem Entwicklungszyklus ab. In den Composer-Dokumenten heißt es natürlich in Fettdruck: "Übernehmen Sie die composer.lock Ihrer Anwendung (zusammen mit composer.json) in die Versionskontrolle" . Wählen Sie mit Bedacht =)composer.json
. In denrequire
Abschnitt können Sie setzen :"repo": "dev-master#2633721877cae79ad461f3ca06f3f77fb4fce02e"
. Dies wird 1) zum Zweig gehen, 2) diesen Hash auschecken, 3) wenn der Hash nicht im Zweig gefunden wird, jedoch den Kopf des angegebenen Zweigs auschecken (in diesem Fall Master).1. Sie sollten Ihre Abhängigkeiten nicht direkt von Production aktualisieren , da Sie nicht wissen, wie sich dies auf die Stabilität Ihres Codes auswirkt. Es könnten Fehler mit den neuen Abhängigkeiten auftreten, es könnte das Verhalten des Codes ändern, das sich auf Ihre eigenen auswirkt, es könnte mit anderen Abhängigkeiten nicht kompatibel sein usw. Sie sollten dies in einer Entwicklungsumgebung tun, gefolgt von ordnungsgemäßen QS- und Regressionstests usw. .
2. Sie sollten die Versionskontrolle Ihrer Datei composer.lock durchführen , da hier Informationen zu Ihren Abhängigkeiten und zu den Abhängigkeiten Ihrer Abhängigkeiten gespeichert werden, mit denen Sie den aktuellen Status des Codes replizieren können. Dies ist wichtig, da alle Ihre Tests und Entwicklungen anhand eines bestimmten Codes durchgeführt wurden. Wenn Sie sich nicht um die tatsächliche Version des Codes kümmern, die Sie haben, können Sie Codeänderungen in Ihre Anwendung hochladen und nicht testen. Wenn Sie Ihre Abhängigkeitsversionen aktualisieren, sollte dies bereitwillig geschehen, und Sie sollten die erforderliche Sorgfalt walten lassen, um sicherzustellen, dass alles noch funktioniert. Wenn Sie ein oder zwei Stunden Betriebszeit verlieren, um zu einer früheren Version zurückzukehren, können Sie viel Geld kosten.
Eines der Argumente, die Sie sehen werden, wenn Sie composer.lock nicht benötigen, ist, dass Sie die genaue Version festlegen können, die Sie in Ihrer composer.json- Datei benötigen , und dass sie auf diese Weise jedes Mal, wenn jemand ausgeführt
composer install
wird, gleich installiert werden Code. Dies ist nicht der Fall, da Ihre Abhängigkeiten ihre eigenen Abhängigkeiten haben und ihre Konfiguration möglicherweise in einem Format angegeben wird, das Aktualisierungen von Subversionen oder sogar ganzen Versionen ermöglicht.Dies bedeutet , dass selbst dann , wenn Sie angeben , dass Sie Laravel 4.1.31 in Ihrem wollen composer.json , Laravel in seiner composer.json Datei ihre eigenen Abhängigkeiten als Symfony Ereignis-Dispatcher benötigt haben könnte: 2. *. Mit dieser Art von Konfiguration könnten Sie Laravel 4.1.31 mit Symfony Event-Dispatcher 2.4.1 erhalten, und jemand anderes in Ihrem Team könnte Laravel 4.1.31 mit Event-Dispatcher 2.6.5 haben. Dies hängt alles davon ab, wann war das letzte Mal, dass Sie die Composer-Installation ausgeführt haben.
Wenn Sie also Ihre composer.lock- Datei im Versionssystem haben, wird die genaue Version dieser Unterabhängigkeiten gespeichert. Wenn Sie und Ihr Teamkollege eine Composer-Installation durchführen (auf diese Weise installieren Sie Ihre Abhängigkeiten basierend auf einem Composer. Sperre ) Sie erhalten beide die gleichen Versionen.
Was ist, wenn Sie aktualisieren möchten? Führen Sie dann in Ihrer Entwicklungsumgebung Folgendes aus:
composer update
Dies generiert eine neue composer.lock- Datei (falls es etwas Neues gibt) und nachdem Sie es getestet haben, und QS-Test und Regression testen Sie es und so weiter. Sie können darauf drängen, dass alle anderen die neue composer.lock herunterladen , da sie sicher aktualisiert werden kann.3. Sie sollten Ihre tatsächlichen Abhängigkeiten nicht versionieren , da dies keinen Sinn ergibt. Mit composer.lock können Sie die genaue Version der Abhängigkeiten installieren und müssen sie nicht festschreiben. Warum sollten Sie Ihrem Repo 10000 Dateien mit Abhängigkeiten hinzufügen, wenn Sie diese nicht aktualisieren sollen? Wenn Sie eines davon ändern müssen, sollten Sie es teilen und dort Ihre Änderungen vornehmen. Wenn Sie sich Sorgen machen, dass Sie bei jedem Build oder Release die tatsächlichen Abhängigkeiten abrufen müssen, bietet Composer verschiedene Möglichkeiten, um dieses Problem, den Cache, die Zip-Dateien usw. zu beheben.
quelle
Quelle: Komponist: Alles dreht sich um die Sperrdatei .
Quelle: Composer - Grundlegende Verwendung .
quelle
Wenn Sie Bedenken haben, dass Ihr Code beschädigt wird, sollten Sie dies
composer.lock
Ihrem Versionskontrollsystem zuweisen, um sicherzustellen, dass alle Ihre Projektmitarbeiter dieselbe Version des Codes verwenden. Ohne Sperrdatei wird jedes Mal ein neuer Code von Drittanbietern abgerufen.Die Ausnahme ist, wenn Sie Meta-Apps verwenden, Bibliotheken, in denen die Abhängigkeiten bei der Installation aktualisiert werden sollten (wie die Zend Framework 2 Skeleton App ). Ziel ist es daher, jedes Mal, wenn Sie mit der Entwicklung beginnen möchten, die neuesten Abhängigkeiten zu ermitteln.
Quelle: Komponist: Alles dreht sich um die Sperrdatei
Siehe auch: Was sind die Unterschiede zwischen Composer-Update und Composer-Installation?
quelle
Darauf gibt es keine genaue Antwort.
Im Allgemeinen sollte Composer nicht das tun, was das Build-System tun soll, und Sie sollten Composer.lock nicht in VCS einfügen. Der Komponist könnte es seltsamerweise rückwärts haben. Endbenutzer sollten keine Sperrdateien verwenden, anstatt zu produzieren. Normalerweise speichert Ihr Build-System Snapshots, wiederverwendbare Verzeichnisse usw. und nicht jedes Mal ein leeres Verzeichnis. Leute, die eine Bibliothek von Composer auschecken, möchten möglicherweise, dass diese Bibliothek eine Sperre verwendet, damit die Abhängigkeiten, die lib lädt, getestet wurden.
Auf der anderen Seite erhöht dies die Belastung der Versionsverwaltung erheblich, da Sie mit ziemlicher Sicherheit mehrere Versionen jeder Bibliothek wünschen, da Abhängigkeiten streng gesperrt sind. Wenn es wahrscheinlich ist, dass jede Bibliothek eine etwas andere Version hat, benötigen Sie Unterstützung für mehrere Bibliotheksversionen, und Sie können auch schnell erkennen, wie groß die benötigten Abhängigkeiten sind, und daher den Ratschlag, sie auf dem Blatt zu halten.
Wenn ich das berücksichtige, finde ich Sperrdateien weder für Bibliotheken noch für Ihre eigenen Arbeitsverzeichnisse wirklich nützlich. Es wird nur für mich in meiner Build- / Testplattform verwendet, die alle extern erworbenen Assets beibehält und sie nur auf Anfrage aktualisiert und wiederholbare Builds zum Testen, Erstellen und Bereitstellen bereitstellt. Während dies in VCS beibehalten werden kann, wird es nicht immer im Quellbaum gespeichert. Die Build-Bäume befinden sich entweder an einer anderen Stelle in der VCS-Struktur oder werden von einem anderen System an einem anderen Ort verwaltet. Wenn es in einem VCS gespeichert ist, ist es fraglich, ob es im selben Repo wie die Quellbäume aufbewahrt werden soll oder nicht, da sonst jeder Pull eine Menge Build-Assets einbringen kann. Ich mag es sehr, alles in einem übersichtlichen Repo zu haben, mit Ausnahme von Produktion / sensiblen Anmeldeinformationen und Aufblähen.
SVN kann es besser als Git, da es Sie nicht zwingt, das gesamte Repo zu erwerben (obwohl ich vermute, dass dies auch für Git nicht unbedingt erforderlich ist, aber die Unterstützung dafür ist begrenzt und wird nicht häufig verwendet). Einfache Build-Repos sind normalerweise nur ein Overlay-Zweig, in den Sie den Build-Baum zusammenführen / exportieren. Einige Leute kombinieren externe Ressourcen in ihrem Quellbaum oder trennen weitere externe, Build- und Quellbäume. Es dient normalerweise zwei Zwecken: Build-Caching und wiederholbare Builds. Manchmal ermöglicht es jedoch, es auf mindestens einer bestimmten Ebene getrennt zu halten, auch neue / leere Builds und mehrere Builds.
Hierfür gibt es eine Reihe von Strategien, von denen keine besonders gut dazu geeignet ist, die Quellenliste beizubehalten, es sei denn, Sie behalten die externe Quelle in Ihrem Quellbaum.
Sie haben auch Dinge wie Hashes in der Datei. Wie wird das zusammengeführt, wenn zwei Personen Pakete aktualisieren? Das allein sollte Sie denken lassen, dass dies möglicherweise falsch ausgelegt ist.
Die Argumente, die die Leute für Sperrdateien vorbringen, sind Fälle, in denen sie das Problem sehr spezifisch und restriktiv betrachtet haben. Willst du wiederholbare Builds und konsistente Builds? Fügen Sie den Herstellerordner in VCS ein. Dann beschleunigen Sie auch das Abrufen von Assets und müssen sich beim Erstellen nicht auf potenziell defekte externe Ressourcen verlassen. Keine der von mir erstellten Build- und Deployment-Pipelines erfordert externen Zugriff, sofern dies nicht unbedingt erforderlich ist. Wenn Sie eine externe Ressource aktualisieren müssen, ist dies nur einmal der Fall. Was Composer zu erreichen versucht, ist für ein verteiltes System sinnvoll, außer wie oben erwähnt, macht es keinen Sinn, da es für Bibliotheksaktualisierungen mit häufigen Konflikten und Aktualisierungen, die so langsam sind wie das am langsamsten zu aktualisierende Paket, zur Hölle der Bibliotheksabhängigkeit führen würde.
Zusätzlich aktualisiere ich wild. Jedes Mal, wenn ich mich entwickle, aktualisiere und teste ich alles. Es gibt ein sehr sehr kleines Fenster, in das sich eine signifikante Versionsdrift einschleichen kann. Auch realistisch gesehen, wenn die semantische Versionierung beibehalten wird, was normalerweise für Komponisten gilt, werden nicht so viele Kompatibilitätsprobleme oder -brüche auftreten.
In composer.json legen Sie die gewünschten Pakete und deren Versionen ab. Dort können Sie die Versionen sperren. Diese Pakete haben jedoch auch Abhängigkeiten mit dynamischen Versionen, die nicht von composer.json gesperrt werden (obwohl ich nicht verstehe, warum Sie sie nicht auch selbst dort ablegen können, wenn Sie möchten, dass sie versioniert werden), sodass jemand anderes Composer installiert bekommt etwas anderes ohne das Schloss. Das interessiert dich vielleicht nicht sehr, oder es interessiert dich, es kommt darauf an. Sollte es dich interessieren? Wahrscheinlich zumindest ein wenig genug, um sicherzustellen, dass Sie sich in jeder Situation und bei möglichen Auswirkungen darüber im Klaren sind, aber es ist möglicherweise auch kein Problem, wenn Sie immer die Zeit haben, zuerst DRY auszuführen und alles zu reparieren, was aktualisiert wurde.
Der lästige Komponist versucht zu vermeiden, dass er manchmal einfach nicht da ist, und der Ärger, den Komponistensperrdateien verursachen können, ist erheblich. Sie haben absolut kein Recht, Benutzern zu sagen, was sie in Bezug auf Build- oder Quell-Assets tun sollen oder nicht (ob sie in VCS getrennt werden sollen), da dies nicht ihre Sache ist, sie sind nicht der Chef von Ihnen oder mir. "Komponist sagt" ist keine Autorität, sie sind weder Ihr Vorgesetzter noch geben sie jemandem eine Überlegenheit in diesem Bereich. Nur Sie kennen Ihre reale Situation und was dafür am besten ist. Sie empfehlen jedoch möglicherweise eine Standardmaßnahme für Benutzer, die nicht verstehen, wie die Dinge funktionieren. In diesem Fall möchten Sie dies möglicherweise befolgen, aber ich persönlich denke nicht, dass ' Ein echter Ersatz dafür, zu wissen, wie die Dinge funktionieren und in der Lage zu sein, Ihre Anforderungen richtig zu trainieren. Letztendlich ist ihre Antwort auf diese Frage eine gute Vermutung. Die Leute, die Komponisten machen, wissen nicht, wo Sie Ihren Komponisten aufbewahren sollen. Ihre einzige Verantwortung ist es, Ihnen zu sagen, was es ist und was es tut. Darüber hinaus müssen Sie entscheiden, was für Sie am besten ist.
Das Behalten der Sperrdatei ist für die Benutzerfreundlichkeit problematisch, da Composer sehr geheim ist, ob es Sperr- oder JSON-Dateien verwendet, und es nicht immer zu gut ist, beide zusammen zu verwenden. Wenn Sie install ausführen, wird nur die Sperrdatei verwendet, die angezeigt wird. Wenn Sie also etwas zu composer.json hinzufügen, wird es nicht installiert, da es sich nicht in Ihrer Sperre befindet. Es ist überhaupt nicht intuitiv, was Operationen wirklich tun und was sie in Bezug auf die json / lock-Datei tun, und manchmal scheint es nicht einmal sinnvoll zu sein (Hilfe sagt, dass die Installation einen Paketnamen nimmt, aber beim Versuch, sie zu verwenden, sagt sie nein ).
Um die Sperre zu aktualisieren oder Änderungen von json im Grunde zu übernehmen, müssen Sie update verwenden und möchten möglicherweise nicht alles aktualisieren. Das Schloss hat Vorrang bei der Auswahl der zu installierenden Elemente. Wenn es eine Sperrdatei gibt, wird diese verwendet. Sie können das Update etwas einschränken, aber das System ist immer noch ein Chaos.
Das Aktualisieren braucht ein Alter, viel RAM. Ich vermute auch, wenn Sie ein Projekt aufgreifen, das eine Weile nicht berührt wurde, dass es von den Versionen, die es hat, aussah, von denen es im Laufe der Zeit mehr geben wird, und es wahrscheinlich nicht effizient macht, was es nur erwürgt.
Sie sind sehr, sehr hinterhältig, wenn es darum geht, geheime zusammengesetzte Befehle zu haben, von denen man nicht erwarten kann, dass sie zusammengesetzt sind. Standardmäßig wird der Befehl zum Entfernen des Komponisten angezeigt, um beispielsweise dem Komponisten-Update und dem Komponisten-Entfernen zuzuordnen.
Die Frage, die Sie wirklich stellen müssen, ist nicht, ob Sie die Sperre in Ihrem Quellbaum behalten sollen oder ob Sie sie irgendwo auf irgendeine Weise beibehalten sollen oder nicht, sondern ob Sie fragen sollten, was sie tatsächlich tut, dann können Sie selbst entscheiden wann und wo Sie es beibehalten müssen.
Ich werde darauf hinweisen, dass die Fähigkeit, die Sperre zu haben, eine große Bequemlichkeit ist, wenn Sie eine robuste Strategie für die Persistenz externer Abhängigkeiten haben, da sie die Informationen verfolgt, die nützlich sind, um diese (die Ursprünge) zu verfolgen und zu aktualisieren, aber wenn Sie dies nicht tun dann ist es weder hier noch da. Es ist nicht nützlich, wenn es als obligatorische Option in den Hals gedrückt wird, damit es Ihre Quellbäume verschmutzt. Es ist eine sehr häufige Sache, in älteren Codebasen zu finden, in denen viele Änderungen an composer.json vorgenommen wurden, die nicht wirklich angewendet wurden und fehlerhaft sind, wenn Benutzer versuchen, Composer zu verwenden. Kein Composer.lock, kein Desync-Problem.
quelle
Ja offensichtlich.
Dies liegt daran, dass ein lokal installierter Composer der Datei composer.lock gegenüber composer.json den ersten Vorzug gibt.
Wenn die Sperrdatei in vcs nicht verfügbar ist, zeigt der Composer auf die Datei composer.json, um die neuesten Abhängigkeiten oder Versionen zu installieren.
Die Datei composer.lock behält die Abhängigkeit eingehender bei, dh sie verweist auf das tatsächliche Festschreiben der Version des Pakets, das wir in unsere Software aufnehmen. Daher ist dies eine der wichtigsten Dateien, die die Abhängigkeit genauer behandelt.
quelle