Die ultimative Entwicklungsumgebung zur Webentwicklung?

JR Cologne

Administrator
Teammitglied
Hallo an die Web-Freunde unter uns,

ich würde gerne eine kleine Diskussion zur lokalen Entwicklungsumgebung für den Bereich der Webentwicklung anstoßen, um mir in diesem Zuge auf der einen Seite konkrete Anregungen und Handlungsmöglichkeiten für die eigene Entwicklungsumgebung einzuholen, auf der anderen Seite aber auch Inspirationen zu sammeln sowie einfach mal ein wenig über den Tellerrand zu schauen, wie es sich andere in der eigenen Entwicklungsumgebung so bequem machen.

Ich bin jetzt schon seit längerer Zeit in der Bredouille, dass ich nicht so richtig happy mit der vorherrschenden Situation bin, auf der anderen Seite aber auch nicht wirklich die zündende Idee habe, was ich wie verbessern könnte.

Ich beginne mal mit der Schilderung meiner aktuellen Situation:
Im Grunde habe ich explizit keinerlei Webserver auf meinem PC installiert. Xampp habe ich schon vor längerer Zeit rausgeschmissen.
Wenn ich an Webanwendungen mit PHP arbeite, nutze ich dementsprechend den eingebauten Webserver von PHP.
Für reine Backend-Anwendungen ohne viel Hokuspokus funktioniert das noch ganz gut.
Wenn allerdings dann Frontend-Geschichten hinzukommen, die ein Build-System benötigen, wird es langsam schwieriger.
Mit Gulp habe ich diesbezüglich schon häufiger gearbeitet, sodass ich schnell ein einigermaßen verlässliches Build-System zur Verfügung habe.
In Verbindung mit einer PHP-Anwendung stellt sich allerdings das Problem ein, dass Sachen wie der Auto-Reload im Browser wegfallen und sich die Frontend-Entwicklung für eine PHP-Anwendung dann direkt wieder eingestaubter anfühlt.
Zusätzlich muss man auch sagen, dass der PHP-Webserver natürlich auch nicht wirklich die produktive Umgebung abbilden kann und sich in der Funktionalität teilweise von einem normalen Apache-Webserver unterscheidet.
Was will ich sagen: Ideal ist mein Setup dann bestimmt nicht.

Kommen wir zum Thema Verwaltung von PHP-Versionen: Im Grunde habe ich hier die Situation, dass ich immer mehrere PHP-Versionen auf meinem PC installiert habe, diese aber nicht gleichzeitig betrieben werden. Die Auswahl einer entsprechenden Version geschieht praktisch dadurch, dass ich den PHP-Installationsordner, der in der Systemumgebung vermerkt ist, einmal komplett leere und aus meinen Ordner mit den verschiedenen PHP-Versionen einen dort reinkopiere. Ein wenig umständlich, nennen wir das mal so. :D
Vollkommen ignoriert ist dabei natürlich noch die Tatsache, dass ich den Quellcode der unterschiedlichen PHP-Versionen immer mal wieder aktualisieren muss, indem ich den Quellcode von der PHP-Website runterlade, entpacke und dann entsprechend nach meinem System arrangiere.

Nächstes Problem: Die Datenbank. In dem Fall habe ich mittels des "MySQL Installer for Windows" einen MySQL Server in Version 8 installiert. Die Verwaltung regel ich über das Programm HeidiSQL. Das geht alles. Allerdings wünsche ich mir hier auch mehr Flexibilität. Ich möchte ja nicht alle paar Wochen die DB neu installieren, mehrere Versionen verwalten müssen oder gar noch andere DB-Systeme wie PostgreSQL auf meinem PC rumfliegen haben.

Und zu guter Letzt: Das leidige Thema IDE/Code-Editor. Ich hatte bis vor wenigen Monaten noch die Möglichkeit, kostenlos die IDEs von Jetbrains auszutesten. Nach kurzer Eingewöhnungsphase fand ich VS Code nur noch klobig und ineffizient, während insbesondere PHPStorm es mir richtig angetan hatte, obwohl ich wahrscheinlich größtenteils nur die Spitze des Eisbergs von Features berührt habe.
Nun versuche ich mich wieder ein Stück weit an VS Code umzugewöhnen, aber so richtig geklappt hat das noch nicht.
Wahrscheinlich müsste ich mir mal die Zeit nehmen, VS Code entsprechend anzupassen und zu erweitern...

Wie auch immer. Ihr seht, ich bin noch nicht so richtig glücklich mit meinem Setup und hätte gerne mehr Flexibilität und mehr Verwaltungs- und Individualisierungsmöglichkeiten.
Im Grunde wären vorgefertigte Projektumgebungen weitgehend unabhängig und abgekoppelt von meinem PC-System wünschenswert.
Im Idealfall hätte ich für verschiedene Anwendungsfälle unterschiedliche Konfigurationen und Umgebungen zur Verfügung, welche ich dann beim Starten eines neuen Projekts nur kurz auswählen und automatisch durch ein Script o.ä. installieren müsste.

Ein zentrales Stichwort wäre an diesem Punkt wahrscheinlich Docker oder gibt es da noch bessere bzw. einfachere Möglichkeiten?
Wie aufwendig gestaltet es sich, tatsächlich an den Punkt zu kommen, eine vorgefertigte Umgebung für ein Projekt nur kurz auf Befehl installieren zu müssen?
Habt ihr diesbezüglich Tipps, Anregungen oder gar Leitfäden, die einen an die Einrichtung einer solchen Entwicklungsumgebung heranführen?
Auf was setzt ihr so?

Ich danke euch schon mal im Voraus für jegliche Tipps, Anregungen, Diskussionsbeiträge oder Vorstellungen eures persönlichen Setups und ggf. vorhandenen Schwierigkeiten und Problemen, mit denen ihr dabei zu kämpfen habt. :)

Viele Grüße
JR Cologne
 
Uh. Na ob ich der Richtige bin um hier zu Antworten....
Ich nehme ja ganz gern nen Raspi und Linux.
Da kannst du alles drauf installieren was du so brauchst. Apache, nginx, unterschiedliche PHP Versionen MySQL und so weiter.
Dann kommt da nen FTP Server drauf und ne Froxlor oder ISPConfig.
Wenn Ich nen neues Projekt starte lege ich ne Subdomain an, wähle den Webserver, die Datenbank, PHP Version, etc und richte nen quasi einen neuen User ein.
Jetzt kann ich das FTP Verzeichnis auf der Arbeitsmaschine mounten und gut. Wahlweise gehts auch über Samba oder NFS.
So kann ich dann recht zügig ne Angepasste Umgebung schaffen.
Von dem ganzen Rest hab ich keine Ahnung.
 
Na ob ich der Richtige bin um hier zu Antworten....

Habe es ja bewusst auch anderen offen gelassen, die eigene Umgebung vorzustellen. In dem Sinne ist jeder der Richtige. :D

Deine beschriebene Lösung ist sicher für viele ausreichend und vielleicht auch besonders spannend, wenn man daran interessiert ist, Server einzurichten und zu verwalten.
Im Grunde habe ich eine ähnliche Variante auch schon mal in Betracht gezogen, da es auf alle Fälle einer realen Serverumgebung deutlich näher kommt.
Das Hauptproblem daran ist allerdings, dass es letztendlich dennoch eine relativ starre und wenig flexible Lösung ist, da man bei einem neuen Projekt erstmal manuell verschiedene Dinge einrichten müsste.
 
Ein zentrales Stichwort wäre an diesem Punkt wahrscheinlich Docker oder gibt es da noch bessere bzw. einfachere Möglichkeiten?

In deiner Situation würde ich dir entweder zu Docker oder zu Vagrant raten. Bei deinen spezifischen Anforderungen tendenziell zu Docker, aber falsch machst du mit beiden nichts.

Im Falle von Docker ist es üblich, für jede Abhängigkeit einen eigenen Container zu betreiben: Einen für Apache, einen für die Datenbank und bei nicht-monolithischen Anwendungen auch einen für das Frontend. Um Verwaltung und Betrieb dieser Container zu vereinfachen, gibt es Docker Compose als Wrapper um die normale Docker-CLI. Compose erstellt die verschiedenen Container gemäß deiner Definition und kümmert sich um deren Vernetzung.

Grundsätzlich gäbe es zwei mögliche Setups als Entwicklungsumgebung:

1. Globale Entwicklungsumgebung
Dieser bequemere Weg ist nur sinnvoll, wenn du alleine an Projekten arbeitest und all diese Projekte sehr ähnlich sind. Hier definierst du mit Docker Compose all deine Container, die du für die Entwicklung brauchst und mountest ein globales Projekt-Verzeichnis, das alle Projekte enthält, an den Apache-Container. Apache kann dann in jedem Projekt auf die PHP-Dateien zugreifen und sie ausliefern. Sollte sich deine gewünschte PHP- oder MySQL-Version ändern, änderst du kurzerhand das zu verwendende Docker-Image und startest die neuen Container.

Vorteil: Das grundlegende Setup erfolgt nur einmal für dein ganzes System. Nachteil: Projekt-spezifische Setups sind nicht möglich und die anderen Vorteile von Docker fallen weg.

2. Entwicklungsumgebung pro Projekt
Das ist der übliche und in der Regel sinnvollere Weg, den ich auch empfehle. Du definierst deine Entwicklungsumgebung mit Compose für jedes Projekt individuell. Ja, für jedes Projekt fällt dann ein bisschen Arbeit am Anfang an, aber die Vorteile überwiegen:
  • Du bist flexibel in den Versionen für PHP, MySQL, Apache, nginx etc.
  • Für das Customizing musst du nur die Pakete und Extensions installieren, die du für das jeweilige Projekt brauchst
  • Die Service-Definitionen für Compose landen im Repository des Projekts
  • Infrastruktur, Dependencies und Schnittstellen mit dem Host sind für alle Entwickler transparent deklariert
  • Andere Entwickler können das Repository klonen und müssen im Idealfall nur docker-compose up -d ausführen
  • Wenn sich Versionsanforderungen oder Dependencies ändern, sind andere Projekte nicht betroffen
In letzter Zeit gab es leider den ein oder anderen Stolperstein beim Betrieb von Docker auf Windows. Es kann aber sein, dass das mit Docker Desktop oder WSL 2 nun deutlich besser geworden ist - müsstest du ausprobieren.

Vagrant bietet ebenfalls Infrastructure as Code, d. h. die Infrastruktur-Konfiguration liegt direkt im Repository des Projektes. Dann allerdings nicht mit Containern, sondern mit VMs.
 
In deiner Situation würde ich dir entweder zu Docker oder zu Vagrant raten. Bei deinen spezifischen Anforderungen tendenziell zu Docker, aber falsch machst du mit beiden nichts.

Im Falle von Docker ist es üblich, für jede Abhängigkeit einen eigenen Container zu betreiben: Einen für Apache, einen für die Datenbank und bei nicht-monolithischen Anwendungen auch einen für das Frontend. Um Verwaltung und Betrieb dieser Container zu vereinfachen, gibt es Docker Compose als Wrapper um die normale Docker-CLI. Compose erstellt die verschiedenen Container gemäß deiner Definition und kümmert sich um deren Vernetzung.

Grundsätzlich gäbe es zwei mögliche Setups als Entwicklungsumgebung:

1. Globale Entwicklungsumgebung
Dieser bequemere Weg ist nur sinnvoll, wenn du alleine an Projekten arbeitest und all diese Projekte sehr ähnlich sind. Hier definierst du mit Docker Compose all deine Container, die du für die Entwicklung brauchst und mountest ein globales Projekt-Verzeichnis, das alle Projekte enthält, an den Apache-Container. Apache kann dann in jedem Projekt auf die PHP-Dateien zugreifen und sie ausliefern. Sollte sich deine gewünschte PHP- oder MySQL-Version ändern, änderst du kurzerhand das zu verwendende Docker-Image und startest die neuen Container.

Vorteil: Das grundlegende Setup erfolgt nur einmal für dein ganzes System. Nachteil: Projekt-spezifische Setups sind nicht möglich und die anderen Vorteile von Docker fallen weg.

2. Entwicklungsumgebung pro Projekt
Das ist der übliche und in der Regel sinnvollere Weg, den ich auch empfehle. Du definierst deine Entwicklungsumgebung mit Compose für jedes Projekt individuell. Ja, für jedes Projekt fällt dann ein bisschen Arbeit am Anfang an, aber die Vorteile überwiegen:
  • Du bist flexibel in den Versionen für PHP, MySQL, Apache, nginx etc.
  • Für das Customizing musst du nur die Pakete und Extensions installieren, die du für das jeweilige Projekt brauchst
  • Die Service-Definitionen für Compose landen im Repository des Projekts
  • Infrastruktur, Dependencies und Schnittstellen mit dem Host sind für alle Entwickler transparent deklariert
  • Andere Entwickler können das Repository klonen und müssen im Idealfall nur docker-compose up -d ausführen
  • Wenn sich Versionsanforderungen oder Dependencies ändern, sind andere Projekte nicht betroffen
In letzter Zeit gab es leider den ein oder anderen Stolperstein beim Betrieb von Docker auf Windows. Es kann aber sein, dass das mit Docker Desktop oder WSL 2 nun deutlich besser geworden ist - müsstest du ausprobieren.

Vagrant bietet ebenfalls Infrastructure as Code, d. h. die Infrastruktur-Konfiguration liegt direkt im Repository des Projektes. Dann allerdings nicht mit Containern, sondern mit VMs.

Vielen Dank für deine ausführliche Beleuchtung der Möglichkeiten, eine Entwicklungsumgebung mit Docker einzurichten! (y)

Im Grunde klingt deine unter Punkt 2 beschriebene Variante genau danach, was ich mir vorgestellt habe. :)
Docker hatte ich jedenfalls auch schon mal auf meinem Windows-PC installiert, allerdings dann nicht weiter verfolgt.

Ich werde in der nächsten Zeit mal versuchen, exemplarisch eine solche Umgebung für ein Projekt mit Docker einzurichten.
Hast du da zufällig irgendwelche Empfehlungen für Tutorials o.ä., die zeigen, wie man sich so eine Umgebung mit Docker einrichtet oder muss man im Grunde nur das Grundkonzept verstehen und schon weiß man, wie es geht?
 
Hast du da zufällig irgendwelche Empfehlungen für Tutorials o.ä., die zeigen, wie man sich so eine Umgebung mit Docker einrichtet oder muss man im Grunde nur das Grundkonzept verstehen und schon weiß man, wie es geht?

Wenn du derjenige bist, der die Umgebung definiert, musst du ein paar Zusammenhänge verstehen und eigene Dockerfiles schreiben. Das ist anfangs sicherlich Neuland, aber keine Rocket-Science. Es gibt unzählige Tutorials dazu. Hier wird beispielsweise ein eigenes Image für das PHP-Projekt gebaut und per Compose mit MySQL verdrahtet: My Simple Approach to using Docker and PHP

Im Zweifelsfall einfach hier fragen oder bei StackOverflow schauen, die Community ist groß.
 
Wenn du derjenige bist, der die Umgebung definiert, musst du ein paar Zusammenhänge verstehen und eigene Dockerfiles schreiben. Das ist anfangs sicherlich Neuland, aber keine Rocket-Science. Es gibt unzählige Tutorials dazu. Hier wird beispielsweise ein eigenes Image für das PHP-Projekt gebaut und per Compose mit MySQL verdrahtet: My Simple Approach to using Docker and PHP

Im Zweifelsfall einfach hier fragen oder bei StackOverflow schauen, die Community ist groß.

Alles klar, ich werde mich schon irgendwie reinfuchsen. :D Danke dir!
Das verlinkte Tutorial passt ja schon mal ganz gut, angesichts der Tatsache, dass ich mal wieder was Nettes mit Laravel machen könnte. :)
 
Docker ist super geeignet dafür, aber für eine lokale Entwicklungsumgebung ein bisschen Kanonen auf Spatzen.
Ich habe mich mit WSL arrangiert, ist zwar (in Version 1) keine 100% vollwertige Linux-Umgebung, aber sehr nah dran.

Mit WSL habe ich Ubuntu eingerichtet und darauf dann Apache, MariaDB und PHP als FPM installiert. Verschiedene PHP-Versionen sind da auch kein Problem, mit dem Offiziellen PPA (https://launchpad.net/~ondrej/+archive/ubuntu/php) kannst du diverse PHP-Versionen nebeneinander installieren und beim Start auswählen welche Version du haben möchtest.

Nachteil: Du musst grundlegende Linux-Kenntisse haben, immerhin installierst du dir eine richtige LAMP-Umgebung. Aber keine Sorge, das ist relativ einfach. Tipp: Starte den OpenSSH Server unter WSL damit du mit FileZilla auf das Dateisystem zugreifen kannst. (Unter WSL auf das Windows-Dateisystem zugreifen ist kein Problem, nur anders herum ist es nicht ganz so einfach).

WSL ist auch in VSCode integriert. D.h. du kannst mit einer Remote-Funktion VSCode in der WSL-Umgebung starten und hast dann nur die GUI unter Windows. Das ermöglicht dir auch eine tiefgreifende Integration aller unter Ubuntu bekannten Tools in VSCode. Dies ist aber in der Regel nur dann notwendig, wenn du mit C/C++ arbeitest und CLANG/GCC nutzen möchtest ohne dir mit MinGW was zurechtzufrickeln (Tipp: Man kann in WSL auch Programme für Windows übersetzen), andere Sprachen werden von Haus aus sehr gut unterstützt (für PHP empfehle ich PHP Intelephense in der "Pro" Version).

Mir persönlich reicht es aus, den Terminal von Ubuntu verfügbar zu haben. Dateien habe ich auf einer separaten Partition abgelegt auf die ich mit Windows sowie Ubuntu zugreifen kann. Damit habe ich auch kein NodeJS/NPM mehr unter Windows sondern nur noch unter Ubuntu über den Paketmanager.
 
Docker ist super geeignet dafür, aber für eine lokale Entwicklungsumgebung ein bisschen Kanonen auf Spatzen.
Ich habe mich mit WSL arrangiert, ist zwar (in Version 1) keine 100% vollwertige Linux-Umgebung, aber sehr nah dran.

Mit WSL habe ich Ubuntu eingerichtet und darauf dann Apache, MariaDB und PHP als FPM installiert. Verschiedene PHP-Versionen sind da auch kein Problem, mit dem Offiziellen PPA (https://launchpad.net/~ondrej/+archive/ubuntu/php) kannst du diverse PHP-Versionen nebeneinander installieren und beim Start auswählen welche Version du haben möchtest.

Nachteil: Du musst grundlegende Linux-Kenntisse haben, immerhin installierst du dir eine richtige LAMP-Umgebung. Aber keine Sorge, das ist relativ einfach. Tipp: Starte den OpenSSH Server unter WSL damit du mit FileZilla auf das Dateisystem zugreifen kannst. (Unter WSL auf das Windows-Dateisystem zugreifen ist kein Problem, nur anders herum ist es nicht ganz so einfach).

WSL ist auch in VSCode integriert. D.h. du kannst mit einer Remote-Funktion VSCode in der WSL-Umgebung starten und hast dann nur die GUI unter Windows. Das ermöglicht dir auch eine tiefgreifende Integration aller unter Ubuntu bekannten Tools in VSCode. Dies ist aber in der Regel nur dann notwendig, wenn du mit C/C++ arbeitest und CLANG/GCC nutzen möchtest ohne dir mit MinGW was zurechtzufrickeln (Tipp: Man kann in WSL auch Programme für Windows übersetzen), andere Sprachen werden von Haus aus sehr gut unterstützt (für PHP empfehle ich PHP Intelephense in der "Pro" Version).

Mir persönlich reicht es aus, den Terminal von Ubuntu verfügbar zu haben. Dateien habe ich auf einer separaten Partition abgelegt auf die ich mit Windows sowie Ubuntu zugreifen kann. Damit habe ich auch kein NodeJS/NPM mehr unter Windows sondern nur noch unter Ubuntu über den Paketmanager.

Hm, auch keine schlechte Variante, allerdings geht das dann ja fast in eine ähnliche Richtung wie @lano's Vorschlag.
Es läuft zwar auf dem selben Gerät, ist dafür aber vom Betriebssystem in gewisser Weise abgekoppelt.
Ein Nachteil ist allerdings definitiv auch die nur begrenzte Flexibilität sowie die Tatsache, dass man lediglich eine globale Umgebung hat.
Zudem kann man die eigene Konfiguration nicht so einfach mit anderen teilen und wiederverwenden.

Ich denke, ich werde mir erstmal Docker anschauen. Die damit verbundenen Kenntnisse schaden auch so sicher nicht.
Sollte mir das dann aber zu bunt werden, wäre WSL bestimmt eine gute Alternative.
 
Das Thema beschäftigt mich ja auch sehr, da ich aktuell noch an einem PHP-Projekt arbeite. Was mich so ein wenig vom reinen WSL abhält ist einfach, dass mir nicht bekannt ist, wie man Konfigurationen dort sichert und wiederherstellt. Mit Docker ist alles versionierbar und man hat nach einem PC-Wechsel oder einer Neuinstallation von Windows keinen so großen Aufwand, alles wieder zum Laufen zu bringen. Außer da gibt es schon Lösungen, von denen ich nichts weiß. Welche Erfahrungen hast du da @asc?

Docker dagegen wird wohl erst mit WSL 2 richtig gut nutzbar werden. Deswegen warte ich da drauf. Da bin ich über den aktuellen Stand aber nicht informiert. Es soll mit Version 2004 Teil von Windows werden, aber ich muss noch mal schauen, ob es trotzdem schon verfügbar ist, so wie auch Edge aktuell. Wird aber definitiv auch mein nächstes Thema werden.
 
Was mich so ein wenig vom reinen WSL abhält ist einfach, dass mir nicht bekannt ist, wie man Konfigurationen dort sichert und wiederherstellt. Mit Docker ist alles versionierbar und man hat nach einem PC-Wechsel oder einer Neuinstallation von Windows keinen so großen Aufwand, alles wieder zum Laufen zu bringen.

Absolut, genau das ist es.
Ich hätte, glaube ich, auch schlicht keine Lust, wenn ich mal kurzzeitig an einem anderen PC arbeiten würde, alles wieder neu einzurichten und passend zu machen, sodass ich vernünftig arbeiten kann. Da würde ich ein Projekt im Zweifel vorübergehend erstmal liegen lassen. :D
 
Man muss fairerweise sagen, dass die einmalige Einrichtung eines LAMP-Stacks in WSL schon der bequemere Weg ist. So eine Umgebung richtet man für jeden PC einmal ein und kann dann ohne jeglichen weiteren Aufwand so viele Projekte in wenigen Minuten in die Welt setzen, wie man will. Bei der Lösung mit Docker muss man erst jedes mal die Anwendung vollständig containerisieren, was den initialen Aufwand des Projekt-Setups spürbar erhöht.

Die Belohnung, die man dafür bekommt, ist die einfache Portierbarkeit der Anwendung. Je mehr Entwickler an einem Projekt arbeiten, desto größer wird dieser Vorteil.
 
Ich hab da halt vor der initialen Einrichtung mit einem blanken Linux/WSL mehr "Angst" (ich hab das nämlich schon mehrmals gemacht), als vor der ersten Docker-Einrichtung pro Projekt. Für Docker gibt es Anleitungen, die man befolgen kann. Man kann auch Dockerkonfigurationen von anderen Projekten kopieren und anpassen bzw. abkupfern. Das mildert die Einrichtung eines neuen Projekts ja auch ab.

Bei Linux dagegen hat man halt komplette Narrenfreiheit, was sehr leicht ausarten kann. Und eine Linuxinstallation nachzubilden, wenn man nichts manuell dokumentiert hat, ist äußerst schwierig. Ich mag ja das Terminal, aber sich durch die Ordnerstruktur zu hangeln und Konfigurationsdateien anzeigen macht mir immer noch keinen großen Spaß :D und dabei bloß nichts vergessen. Man müsste ein Setup auf Basis eines jungfräulichen Linux per Skript durchführen. Das Skript zu schreiben, während man aber noch experimentiert, was man überhaupt braucht und was funktioniert, erfordert auch sehr viel Disziplin und Ausdauer - jedenfalls für mich.
 
Ich kann die Bedenken nachvollziehen, aber ich persönlich habe WSL + LAMP in max. einer Stunde eingerichtet und startklar (inkl. Aktivierung von WSL und Installation von Ubuntu).

Für das das übersichtlichere Datei-Management nutze ich OpenSSH und FileZilla und verbinde mich zu [::1]. Kleinigkeiten erledige ich mit Nano auf der Konsole :D In der Regel fässt man die Installation nach der initialen Einrichtung eh nicht mehr großartig an, sondern fährt nur noch Updates (via apt), es sei denn es ändern sich gröbere Dinge, aber das kann unter Windows genauso passieren.
 
Zurück
Oben Unten