MariaDb statt MariaDB: wie macOS Dateinamen in git verfälscht
Doctrine DBAL hat in Version 4 mehrere Plattformklassen von MariaDb… in MariaDB… umbenannt. Auf einem Mac kommt davon nur der Inhalt an: Das Dateisystem hält beide Namen für denselben, die alte Schreibweise bleibt stehen. Wird vendor/ mitversioniert, landet sie so im Repository.
Der Widerspruch, den man leicht übersieht
$ ls vendor/doctrine/dbal/src/Platforms/ | grep -i maria MariaDb1010Platform.php $ grep '^class' vendor/doctrine/dbal/src/Platforms/MariaDb1010Platform.php class MariaDB1010Platform extends MariaDB1060Platform
Die Klasse heißt MariaDB1010Platform, die Datei MariaDb1010Platform.php. PSR-4 sucht nach dem Klassennamen. Auf macOS findet es die Datei trotzdem, auf dem Linux-Server nicht – dort ist die Klasse schlicht nicht vorhanden.
Nachweisen lässt es sich in einer Zeile
php -r 'require "vendor/autoload.php";
var_dump(class_exists("Doctrine\\DBAL\\Platforms\\MariaDB1010Platform"));'
# macOS: bool(true)
# Linux: bool(false)
Der Fehler schlägt nur zu, wenn die betroffene Klasse tatsächlich gebraucht wird – bei den Doctrine-Plattformklassen also erst, wenn der Datenbankserver MariaDB ist. Auf MySQL bleibt er jahrelang stumm.
Die Versuchung ist groß, die Dateien von Hand umzubenennen. Davon ist abzuraten: In vendor/ gehört keine Handarbeit, und ein composer update kann die Schreibweise auf macOS auch nicht reparieren – genau so ist der Fehler ja entstanden. Die saubere Lösung ist, vendor/ nicht zu versionieren und beim Deploy auf dem Server composer install --no-dev laufen zu lassen. Dann entpackt Composer auf einem Dateisystem, das Groß- und Kleinschreibung unterscheidet, und die Namen stimmen von selbst.
Erstellt am: