Composer hat die Möglichkeit, mehrere Abhängigkeiten nur während der Entwicklung zu laden, sodass die Tools nicht in der Produktion (auf dem Live-Server) installiert werden. Dies ist (theoretisch) sehr praktisch für Skripte, die nur in der Entwicklung sinnvoll sind, wie Tests, Tools für gefälschte Daten, Debugger usw.
Der Weg zu gehen ist, einen zusätzlichen require-dev
Block mit den Tools hinzuzufügen, die Sie in dev benötigen:
"require-dev": {
"codeception/codeception": "1.6.0.3"
}
und dann (theoretisch) diese Abhängigkeiten über laden
composer install --dev
Problem & Frage:
Composer hat das Verhalten von install
und update
im Jahr 2013 dramatisch geändert. require-dev
Abhängigkeiten werden jetzt standardmäßig (!) Installiert. Sie können auch eine composer.json mit einem require-dev
Block erstellen und eine composer install
Reproduktion durchführen.
Die am meisten akzeptierte Art der Bereitstellung besteht darin, den Komponisten zu pushen. Sperren Sie (das Ihr aktuelles Composer-Setup enthält) und führen Sie dann eine composer install
auf dem Produktionsserver aus. Dadurch wird auch das Entwicklungsmaterial installiert.
Was ist der richtige Weg, um dies bereitzustellen, ohne die -dev-Abhängigkeiten zu installieren?
Hinweis: Ich versuche hier ein kanonisches Q / A zu erstellen, um die seltsame Composer-Bereitstellung zu verdeutlichen. Fühlen Sie sich frei, diese Frage zu bearbeiten.
quelle
composer.lock
sollte NIEMALS zum Git-Repo hinzugefügt werden. Der richtige Ansatz besteht darin, beim Staging das Composer-Update zu verwenden und die Datei dann mit der Produktion zu synchronisieren (wenn natürlich alles funktioniert). Staging muss die exakte Kopie einer Produktionsumgebung sein.composer.lock
sollte ein Teil von sein.gitignore
.Antworten:
Warum
Es gibt meiner Meinung nach einen guten Grund, warum Composer das
--dev
Flag standardmäßig verwendet (bei Installation und heutzutage Aktualisierung). Composer wird meistens in Szenarien ausgeführt, in denen dies gewünscht ist:Der grundlegende Workflow für Composer lautet wie folgt:
composer.phar install --dev
, json- und lock-Dateien werden an VCS festgeschrieben.composer.phar install --dev
.composer.phar require <package>
,--dev
wenn Sie das Paket imrequire-dev
Abschnitt (und Festschreiben) möchten .composer.phar install --dev
.composer.phar update --dev <package>
(und Commit).composer.phar install --dev
.composer.phar install --no-dev
Wie Sie sehen können, wird die
--dev
Flagge (weit) mehr als die verwendet--no-dev
Flag verwendet, insbesondere wenn die Anzahl der Entwickler, die an dem Projekt arbeiten, zunimmt.Produktionsbereitstellung
Nun, die
composer.json
undcomposer.lock
-Datei sollte an VCS übergeben werden. Nicht auslassen,composer.lock
da es wichtige Informationen zu Paketversionen enthält, die verwendet werden sollten.Wenn Sie eine Produktionsbereitstellung durchführen, können Sie das
--no-dev
Flag an Composer übergeben:Die
composer.lock
Datei enthält möglicherweise Informationen zu Entwicklungspaketen. Das ist egal. Das--no-dev
Flag stellt sicher, dass diese Entwicklungspakete nicht installiert sind.Wenn ich "Produktionsbereitstellung" sage, meine ich eine Bereitstellung, die auf die Verwendung in der Produktion abzielt. Ich streite nicht darüber, ob a
composer.phar install
auf einem Produktionsserver oder auf einem Staging-Server durchgeführt werden soll, auf dem Dinge überprüft werden können. Das ist nicht der Umfang dieser Antwort. Ich weise nur darauf hin, wie es gehtcomposer.phar install
ohne "dev" -Abhängigkeiten zu installieren.Offtopic
Das
--optimize-autoloader
Flag kann auch in der Produktion wünschenswert sein (es generiert eine Klassenzuordnung, die das automatische Laden in Ihrer Anwendung beschleunigt):Oder wenn die automatische Bereitstellung abgeschlossen ist:
Wenn Ihre Code - Basis unterstützt, könnten Sie tauschen
--optimize-autoloader
für--classmap-authoritative
. Mehr Infos hierquelle
--optimize-autoloader
. Beachten Sie auch:--classmap-authoritative
- In der Dokumentation hier getcomposer.org/doc/03-cli.md können Sie Folgendes sehen: "Autoload-Klassen nur aus der Klassenzuordnung. Aktiviert implizit --optimize-autoloader", damit Sie verwenden können, wenn Sie die Klassen kennen there ", was wahrscheinlich in Ihrer Produktumgebung passieren sollte, wenn Sie keine Klassen dynamisch generieren.optimize-autoloader
direkt in diecomposer.json
:{"config": { "optimize-autoloader": true } }
Eigentlich würde ich GEGEN die Installation von Abhängigkeiten auf dem Produktionsserver wärmstens empfehlen.
Ich empfehle, den Code auf einem Bereitstellungscomputer auszuchecken, Abhängigkeiten nach Bedarf zu installieren (dies schließt das NICHT-Installieren von Entwicklungsabhängigkeiten ein, wenn der Code in die Produktion geht) und dann alle Dateien auf den Zielcomputer zu verschieben.
Warum?
composer install
Lange Rede, kurzer Sinn: Verwenden Sie Composer in einer Umgebung, die Sie steuern können. Ihre Entwicklungsmaschine ist qualifiziert, da Sie bereits über alle für den Betrieb von Composer erforderlichen Funktionen verfügen.
Der zu verwendende Befehl lautet
Dies funktioniert in jeder Umgebung, sei es auf dem Produktionsserver selbst oder auf einer Bereitstellungsmaschine oder auf der Entwicklungsmaschine, die eine letzte Überprüfung durchführen soll, um festzustellen, ob eine Entwicklungsanforderung für die reale Software falsch verwendet wird.
Der Befehl installiert oder deinstalliert die in der Datei composer.lock deklarierten Entwicklungsanforderungen nicht.
Wenn es Ihnen nichts ausmacht, Entwicklungssoftwarekomponenten auf einem Produktionsserver bereitzustellen,
composer install
würde das Ausführen denselben Job ausführen, aber einfach die Anzahl der verschobenen Bytes erhöhen und auch eine größere Autoloader-Deklaration erstellen.quelle
app-1.34.phar
usw.). Es gibt einen separaten Mechanismus, der benachrichtigt wird und entscheidet, wann diese Datei abgerufen werden soll, wohin sie übertragen werden soll und was dann damit geschehen soll. Einige Teams entscheiden sich dafür, das Phar zu entpacken, sobald es auf dem Server ist, und einige Teams führen es so aus, wie es ist. Dies hat der Stabilität und Reproduzierbarkeit unserer Bereitstellungen viel Vertrauen verliehen.Jetzt
require-dev
ist standardmäßig aktiviert, für die lokale Entwicklung können Siecomposer install
undcomposer update
ohne die--dev
Option tun .Wenn Sie für die Produktion bereitstellen möchten, müssen Sie sicherstellen
composer.lock
, dass keine Pakete vorhanden sind, von denen sie stammenrequire-dev
.Sie können dies mit tun
Sobald Sie lokal mit getestet haben
--no-dev
, können Sie alles für die Produktion bereitstellen und basierend auf dem installierencomposer.lock
. Sie benötigen die--no-dev
Option hier erneut, andernfalls sagt der Komponist "Die Sperrdatei enthält keine erforderlichen Entwicklungsinformationen" .Hinweis: Seien Sie vorsichtig mit allem, was zu Unterschieden zwischen Entwickler und Produktion führen kann! Ich versuche generell, require-dev zu vermeiden, wo immer dies möglich ist, da das Einbeziehen von dev-Tools kein großer Aufwand ist.
quelle
composer.lock
zu suchen. Du würdest einfach rennencomposer install --no-dev
und es werden nur die regulären Abhängigkeiten installiert. Tatsächlich entfernt Composer in diesem Schritt auch alle Entwicklungsabhängigkeiten.composer.lock
Entwicklungsabhängigkeiten enthält (und möglicherweise die Versionen von Nicht-Entwicklungspaketen beeinflusst), möchte ich es aktualisieren, um zu reflektieren, wie es in der Produktion sein würde. Dies zwingt Sie auch dazu,composer install --no-dev
in der Produktion zu laufen , ebensocomposer install
wie Fehler. Technisch denke ich, dass Sie Recht haben; Dies ist nicht erforderlich, aber es ist ein zusätzliches Maß an Sicherheit, das mir gefällt.dev/tool
undprod/lib:~1.0
. Das neueste Produkt / lib ist 1.3, aber dev / tool benötigt auchprod/lib:1.1.*
. Ergebnis: Sie installieren Version 1.1.9 (neueste Version von 1.1.x) und verwenden sie während Ihrer Entwicklung. Ich würde sagen, es ist NICHT sicher, nur zu aktualisieren--no-dev
, also das neueste Produkt / lib 1.3 einzuschließen und davon auszugehen, dass alles ohne Tests funktioniert. Und vielleicht ist das Testen dann unmöglich, weil es an Entwicklern / Werkzeugen mangelt. Ich würde annehmen, dass dev / tool, da es in der Produktion nicht benötigt wird, nicht ausgerollt werden sollte, aber die Software dann prod / lib 1.1.9 verwenden muss.--no-dev
, müssen Sie es lokal testen, wie in der Antwort erwähnt. Ich würde trotzdem empfehlen, überhaupt nicht zu verwenden--no-dev
.composer update
dann eine Entwicklung durch, führen Siecomposer update --no-dev
dann die Release-Tests durch, gehen Sie dann zur Produktion und tun Sie diescomposer install --no-dev
. Zwei Probleme: 1. Ich kann die Version nicht ohne Entwicklungsabhängigkeiten testen und 2. Ich kann zum Beispiel nicht mit Git in der Produktion installieren.Auf Produktionsservern benenne ich
vendor
aufvendor-<datetime>
, und während des Einsatzes werden zwei Anbieter dirs haben.Ein HTTP-Cookie veranlasst mein System, den neuen Anbieter auszuwählen
autoload.php
, und nach dem Testen schalte ich vollständig atomar / sofort zwischen ihnen um, um das alte Anbieterverzeichnis für alle zukünftigen Anforderungen zu deaktivieren. Einige Tage später lösche ich das vorherige Verzeichnis.Dies vermeidet Probleme, die durch Dateisystem-Caches verursacht werden, die ich in Apache / PHP verwende, und ermöglicht es auch, dass aktiver PHP-Code weiterhin das vorherige Herstellerverzeichnis verwendet.
Trotz anderer Empfehlungen, die dagegen sprechen, laufe ich persönlich
composer install
auf dem Server, da dies in meinem Staging-Bereich (einer VM auf meinem Laptop) schneller ist als rsync.Ich benutze
--no-dev --no-scripts --optimize-autoloader
. Sie sollten die Dokumente für jedes Dokument lesen, um zu überprüfen, ob dies für Ihre Umgebung geeignet ist.quelle
Ich denke, es ist besser, den Prozess zu automatisieren:
Fügen Sie die Datei composer.lock in Ihr Git-Repository ein und stellen Sie sicher, dass Sie composer.phar install --no-dev verwenden beim Freigeben , aber Dev-Computer können Sie jeden Composer-Befehl ohne Bedenken verwenden. Dies geht nicht in die Produktion Die Produktion basiert ihre Abhängigkeiten in der Sperrdatei.
Auf dem Server checken Sie diese bestimmte Version oder Bezeichnung aus und führen alle Tests aus, bevor Sie die App ersetzen. Wenn die Tests erfolgreich sind, setzen Sie die Bereitstellung fort.
Wenn der Test von Entwicklungsabhängigkeiten abhängt, da Composer keine Testbereichsabhängigkeit hat, könnte eine nicht sehr elegante Lösung den Test mit den Entwicklungsabhängigkeiten ausführen ( composer.phar install ) auszuführen, die Herstellerbibliothek zu entfernen und composer.phar install auszuführen. -no-dev erneut, dies verwendet zwischengespeicherte Abhängigkeiten, ist also schneller. Dies ist jedoch ein Hack, wenn Sie das Konzept der Bereiche in anderen Build-Tools kennen
Automatisiere das und vergiss den Rest, trink ein Bier :-)
PS.: Wie im folgenden Kommentar zu @Sven ist es keine gute Idee, die Datei composer.lock nicht auszuchecken, da dadurch die Composer-Installation als Composer-Update funktioniert.
Sie können diese Automatisierung mit http://deployer.org/ durchführen. Es ist ein einfaches Tool.
quelle
composer.lock
wird sich das socomposer install
verhaltencomposer update
. Die von Ihnen bereitgestellten Versionen sind also nicht die, mit denen Sie entwickelt haben. Dies kann zu Problemen führen (und dies vor allem angesichts des erst kürzlich gelösten Sicherheitsproblems mit "Ersetzen" in Composer). Sie sollten NIEMALScomposer update
unbeaufsichtigt laufen, ohne zu überprüfen, ob nichts kaputt gegangen ist.