Mal angenommen wir hätten folgendes Szenario:
- Produktiv-Server (remote)
- Testing-Server (remote)
- Devel-Server (remote)
- Devel-PC (lokal)
Produktiv- und Testing-Server sollten denke ich soweit klar sein. Der Devel-Server ist der Entwicklungsserver des jeweiligen Entwicklers und der Devel-PC sein lokaler Entwicklungsrechner mit seiner Entwicklungsumgebung.
Der Entwickler entwickelt also lokal auf seinem Devel-PC und nutzt sagen wir mal PhpStorm als IDE. Jede Änderung wird sofort auf seinen Devel-Server übertragen wo er die Möglichkeit hat alles ohne Risiko zu testen. Anschließend kann er seine Änderungen commiten und in ein remote Main-Repository pushen. Auf dem Devel-PC sind deshalb erst mal nur Git und IDE/PhpStorm installiert.
Jetzt kommt der composer ins Spiel. Der Entwickler benötigt nun z.B. Doctrine/ORM in seinem Projekt. Er legt also zuerst eine composer.json Datei an die im einfachsten Fall so aussehen könnte:
Um Doctrine zu installiern wird jetzt nur noch der Composer benötigt. Den kann man sich ja schnell runterladen und installieren. Alles ganz easy. Der Composer benötigt allerdings dann wiederum php, so daß wir auf dem Devel-PC letzendlich doch php installieren müssen. Ist auch kein Drama.
Mit einem einzigen Befehl ist Doctrine dann mit allen Abhängigkeiten schnell installiert
Der Entwickler commitet anschließend nur noch die neue composer.json und (ganz wichtig) auch die neue composer.lock in sein Git-Repo und pusht alles ins Main-Repo (die Branching-Strategie lassen wir an dieser Stell mal außen vor).
Auf dem Testing-Server wird die neue Version dann installiert (ich weiß es ist noch keine neue Version, aber tun wir mal so als ob) und dann passiert Folgendes:
Was ist hier passiert?
Der Entwickler hatte auf seinem Devel-PC wegen des composeres eine aktuelle PHP Version installiert. Für den Entwickler spielt es auch keine Rolle welche PHP-Version auf seinem Rechner installiert ist, denn er entwickelt ja auf einem Remote-Devel-Server und hat in seiner IDE als PHP-Interpreter den Remote-Interpreter des Devel-Servers eingestellt. Auf allen Servern ist aber eine andere, etwas ältere PHP-Version installiert. Der Composer berücksichtigt beim Installieren der Pakete natürlich ausschließlich die Platform-Informationen des lokalen Devel-PCs des Entwicklers, die Konfiguration der Server-Maschinen kann er ja nicht kennen.
Wie kann der Entwickler also die Pakete mittels Composer so installieren, daß die Systemvoraussetzungen auf den Remote-Servern erfüllt werden?
1) Er könnte versuchen lokal seinen Devel-PC entsprechend zu konfigurieren, spricht z.B. die PHP-Version downgraden. Erstens ist das gar nicht mal so trivial, zweitens was ist wenn er an mehreren Projekten mit unterschiedlichen PHP-Versionen/Serverkonfigurationen arbeiten muss. Also keine praxistaugliche Idee.
2) Er könnte versuchen den Composer entsprechend zu konfigurieren, schlechte Nachricht: GEHT NICHT!
Ok, damit hat sich die lokale Installation vom composer eigentlich schon mal als überflüssig erwiesen, so kann man nicht arbeiten. Was bleibt, ist die Pakete mittels Composer direkt auf einer Maschine zu installieren, die im besten Fall identisch konfiguriert ist, wie der Produktiv-Server.
Zweiter Versuch:
1) composer.json auf lokalem devel-pc anpassen (wird automatisch auf den devel-server hochgeladen)
2) auf devel-server einloggen und composer install/update ausführen
Jetzt haben wir zwar garantiert die richtigen Pakete auf dem devel-server, aber unsere lokale IDE weiß leider noch nichts davon. Auf dem lokalen devel-pc fehlt uns also das akt. Vendor-Verzeichnis (wichtig wg. Autocomplete) und die akt. composer.lock (die wir ins Git-Repo commiten müssen). Es wird also noch ein weiterer Schritt notwendig:
3) Lokales Vendor-Verzeichnis und composer.lock mit remote devel-server syncen
So das war’s.
Allerdings finde ich den Worklflow etwas umständlich. Hat jemand vielleicht eine Idee wie man es besser machen könnte?
vg
jack
- Produktiv-Server (remote)
- Testing-Server (remote)
- Devel-Server (remote)
- Devel-PC (lokal)
Produktiv- und Testing-Server sollten denke ich soweit klar sein. Der Devel-Server ist der Entwicklungsserver des jeweiligen Entwicklers und der Devel-PC sein lokaler Entwicklungsrechner mit seiner Entwicklungsumgebung.
Der Entwickler entwickelt also lokal auf seinem Devel-PC und nutzt sagen wir mal PhpStorm als IDE. Jede Änderung wird sofort auf seinen Devel-Server übertragen wo er die Möglichkeit hat alles ohne Risiko zu testen. Anschließend kann er seine Änderungen commiten und in ein remote Main-Repository pushen. Auf dem Devel-PC sind deshalb erst mal nur Git und IDE/PhpStorm installiert.
Jetzt kommt der composer ins Spiel. Der Entwickler benötigt nun z.B. Doctrine/ORM in seinem Projekt. Er legt also zuerst eine composer.json Datei an die im einfachsten Fall so aussehen könnte:
Code:
{
"require": {
"doctrine/orm": "2.4.*"
}
}
Mit einem einzigen Befehl ist Doctrine dann mit allen Abhängigkeiten schnell installiert
Code:
composer install
Auf dem Testing-Server wird die neue Version dann installiert (ich weiß es ist noch keine neue Version, aber tun wir mal so als ob) und dann passiert Folgendes:
Code:
our requirements could not be resolved to an installable set of packages.
Problem 1
- Installation request for symfony/console 2.7.x-dev -> satisfiable by symfony/console[2.7.x-dev].
- symfony/console 2.7.x-dev requires php >=5.3.9 -> your PHP version does not satisfy that requirement.
Problem 2
- symfony/console 2.7.x-dev requires php >=5.3.9 -> your PHP version does not satisfy that requirement.
- doctrine/orm 2.4.x-dev requires symfony/console ~2.0 -> satisfiable by symfony/console[2.7.x-dev].
- Installation request for doctrine/orm 2.4.x-dev -> satisfiable by doctrine/orm[2.4.x-dev].
Was ist hier passiert?
Der Entwickler hatte auf seinem Devel-PC wegen des composeres eine aktuelle PHP Version installiert. Für den Entwickler spielt es auch keine Rolle welche PHP-Version auf seinem Rechner installiert ist, denn er entwickelt ja auf einem Remote-Devel-Server und hat in seiner IDE als PHP-Interpreter den Remote-Interpreter des Devel-Servers eingestellt. Auf allen Servern ist aber eine andere, etwas ältere PHP-Version installiert. Der Composer berücksichtigt beim Installieren der Pakete natürlich ausschließlich die Platform-Informationen des lokalen Devel-PCs des Entwicklers, die Konfiguration der Server-Maschinen kann er ja nicht kennen.
Wie kann der Entwickler also die Pakete mittels Composer so installieren, daß die Systemvoraussetzungen auf den Remote-Servern erfüllt werden?
1) Er könnte versuchen lokal seinen Devel-PC entsprechend zu konfigurieren, spricht z.B. die PHP-Version downgraden. Erstens ist das gar nicht mal so trivial, zweitens was ist wenn er an mehreren Projekten mit unterschiedlichen PHP-Versionen/Serverkonfigurationen arbeiten muss. Also keine praxistaugliche Idee.
2) Er könnte versuchen den Composer entsprechend zu konfigurieren, schlechte Nachricht: GEHT NICHT!
Ok, damit hat sich die lokale Installation vom composer eigentlich schon mal als überflüssig erwiesen, so kann man nicht arbeiten. Was bleibt, ist die Pakete mittels Composer direkt auf einer Maschine zu installieren, die im besten Fall identisch konfiguriert ist, wie der Produktiv-Server.
Zweiter Versuch:
1) composer.json auf lokalem devel-pc anpassen (wird automatisch auf den devel-server hochgeladen)
2) auf devel-server einloggen und composer install/update ausführen
Jetzt haben wir zwar garantiert die richtigen Pakete auf dem devel-server, aber unsere lokale IDE weiß leider noch nichts davon. Auf dem lokalen devel-pc fehlt uns also das akt. Vendor-Verzeichnis (wichtig wg. Autocomplete) und die akt. composer.lock (die wir ins Git-Repo commiten müssen). Es wird also noch ein weiterer Schritt notwendig:
3) Lokales Vendor-Verzeichnis und composer.lock mit remote devel-server syncen
So das war’s.
Allerdings finde ich den Worklflow etwas umständlich. Hat jemand vielleicht eine Idee wie man es besser machen könnte?
vg
jack

.
Kommentar