MariaDb statt MariaDB: wie macOS Dateinamen in git verfälscht

Auf macOS unterscheiden Dateinamen nicht zwischen Groß- und Kleinschreibung. Benennt ein Paket eine Datei nur in der Schreibweise um, kommt die Änderung lokal nie richtig an – und wandert falsch geschrieben ins Repository. Auf dem Linux-Server findet der PSR-4-Autoloader die Klasse dann nicht mehr.

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: