Ich leite ein gehostetes Unternehmen für kontinuierliche Integration , und wir führen den Code unserer Kunden unter Linux aus. Jedes Mal, wenn wir den Code ausführen, führen wir ihn in einer separaten virtuellen Maschine aus. Ein häufig auftretendes Problem besteht darin, dass die Tests eines Kunden manchmal aufgrund der Verzeichnisreihenfolge des auf der VM ausgecheckten Codes fehlschlagen.
Lassen Sie mich näher darauf eingehen. Unter OSX stellt das HFS + -Dateisystem sicher, dass Verzeichnisse immer in derselben Reihenfolge durchsucht werden. Programmierer, die OSX verwenden, gehen davon aus, dass es überall funktionieren muss, wenn es auf ihrem Computer funktioniert. Unter Linux funktioniert dies jedoch häufig nicht, da Linux-Dateisysteme beim Durchlaufen von Verzeichnissen keine Bestellgarantien bieten.
Angenommen, es gibt 2 Dateien, a.rb, b.rb. a.rb definiert MyObject
und b.rb verwendet MyObject
. Wenn a.rb zuerst geladen wird, funktioniert alles. Wenn b.rb zuerst geladen wird, versucht es, auf eine undefinierte Variable zuzugreifen MyObject
, und schlägt fehl.
Aber schlimmer als das ist, dass es nicht immer nur scheitert. Da die Dateisystemreihenfolge unter Linux nicht geordnet ist, wird die Reihenfolge auf verschiedenen Computern unterschiedlich sein. Das ist schlimmer, weil manchmal die Tests bestanden werden und manchmal scheitern. Dies ist das schlechteste mögliche Ergebnis.
Meine Frage ist also, gibt es eine Möglichkeit, die Bestellung von Dateisystemen wiederholbar zu machen. Ein Flag für ext4, das besagt, dass Verzeichnisse immer in einer bestimmten Reihenfolge durchlaufen werden? Oder vielleicht ein anderes Dateisystem, das diese Garantie hat?
quelle
Antworten:
Ich weiß, es ist nicht die Antwort, die Sie suchen, aber ich glaube, die richtige Lösung ist es , abhängig von der Reihenfolge der Dateien in einem Verzeichnis zu vermeiden . Vielleicht ist es immer für alle HFS + -Dateisysteme konsistent, und vielleicht können Sie auch eine Möglichkeit finden, es in ext4 oder einem anderen Dateisystem konsistent zu machen, aber es kostet Sie auf lange Sicht mehr Ärger als es spart. Jemand anders, der Ihre Anwendung verwendet, wird eine böse Überraschung erleben, wenn er nicht merkt, dass sie nur mit einigen Arten von Dateisystemen kompatibel ist und nicht mit anderen. Die Reihenfolge kann sich ändern, wenn ein Dateisystem aus einer Sicherung wiederhergestellt wird. Wahrscheinlich treten Kompatibilitätsprobleme auf, da die konsistente Reihenfolge von HFS + und ext4 möglicherweise nicht identisch sind.
Lesen Sie einfach alle Verzeichniseinträge und sortieren Sie die Liste lexikografisch, bevor Sie sie verwenden. Genau wie es
ls
tut.Sie erwähnen Dateien
a.rb
undb.rb
, wenn es sich um Programmiersprachen-Quelldateien handelt, sollte nicht jede Datei bereits dafür verantwortlich sein, dass alle Abhängigkeiten importiert werden?quelle
Der POSIX-Aufruf in Linux readdir () garantiert keine konsistente Reihenfolge. Wenn Sie geordnete Ergebnisse wünschen, ist die Anwendung, die Dateien verarbeitet, dafür verantwortlich, zu ordnen, wie sie aufrufenden Funktionen präsentiert werden.
/programming/8977441/does-readdir-guarantee-an-order
Nun, da Sie sagten, dies sei der Code Ihres Kunden und Sie können ihn nicht reparieren, könnten Sie möglicherweise die verknüpften Bibliotheken ändern, die verwendet werden, um einen konsistenten readdir () -Aufruf bereitzustellen. Das würde Arbeit kosten und eine eigene Frage wert sein. Eine Kurzanleitung dazu finden Sie unter http://www.ibm.com/developerworks/linux/library/l-glibc/index.html .
Wenn Sie dies ändern, kann dies zu einer Reihe weiterer Probleme führen, die ich möglicherweise nicht vorhersehen kann. Sie werden stark gewarnt, aber es kann eine Lösung sein, wenn Ihr Kunde nicht richtig geschult werden kann.
quelle
Weisen Sie Ihren Kunden darauf hin, dass es eine inhärente Auftragsabhängigkeit gibt, die ausdrücklich angegeben werden sollte. Bieten Sie dem Kunden an, die Abhängigkeit so auszudrücken, dass eine Kompilierung auf allen Systemen funktioniert und der Kunde den geänderten Ablauf übernimmt, der die Abhängigkeit von der Kompilierungsreihenfolge erfasst.
Wenn der Kunde in der Lage sein möchte, auf anderen Maschinen zu kompilieren, wäre es mürrisch, zu glauben, dass es kostenlos ist.
quelle
Modernes Linux (ext4) fügt einen B-Tree-Index für Dateilisten hinzu. Einer seiner Effekte ist, dass die Reihenfolge der Standarddateien von einem Hash ihrer Namen abhängt.
Um diese Funktion zu deaktivieren, verwenden Sie:
quelle