Prowadzę hostowaną firmę zajmującą się ciągłą integracją , a także kod naszych klientów w systemie Linux. Za każdym razem, gdy uruchamiamy kod, uruchamiamy go na osobnej maszynie wirtualnej. Częstym problemem, który się pojawia, jest to, że testy klienta czasami kończą się niepowodzeniem z powodu uporządkowania katalogu ich kodu wypisanego na maszynie wirtualnej.
Pozwól mi bardziej szczegółowo. W systemie OSX system plików HFS + zapewnia, że katalogi są zawsze przeglądane w tej samej kolejności. Programiści używający OSX zakładają, że jeśli działa na ich komputerze, musi działać wszędzie. Ale często nie działa w systemie Linux, ponieważ systemy plików Linux nie oferują gwarancji porządkowania podczas przeglądania katalogów.
Jako przykład rozważmy, że istnieją 2 pliki, a.rb, b.rb. a.rb określa MyObject
, a b.rb używa MyObject
. Jeśli a.rb zostanie załadowany jako pierwszy, wszystko będzie działać. Jeśli b.rb zostanie załadowany jako pierwszy, spróbuje uzyskać dostęp do niezdefiniowanej zmiennej MyObject
i zakończy się niepowodzeniem.
Ale gorsze jest to, że nie zawsze kończy się to niepowodzeniem. Ponieważ porządkowanie systemu plików w systemie Linux nie jest uporządkowane, na różnych komputerach będzie inna kolejność. Jest to gorsze, ponieważ czasami testy przechodzą pomyślnie, a czasem kończą się niepowodzeniem. To najgorszy możliwy wynik.
Moje pytanie brzmi więc, czy istnieje sposób na powtarzalność zamawiania systemu plików. Jakaś flaga do ext4, która mówi, że zawsze będzie przechodzić przez katalogi w określonej kolejności? A może inny system plików, który ma taką gwarancję?
źródło
Odpowiedzi:
Wiem, że nie jest to odpowiedź, której szukasz, ale uważam, że właściwym rozwiązaniem jest unikanie zależności od kolejności plików w katalogu. Być może zawsze jest spójny we wszystkich systemach plików HFS +, a może możesz znaleźć sposób, aby uczynić go spójnym w ext4 lub innym systemie plików, ale na dłuższą metę będzie cię to kosztowało więcej kłopotów niż zaoszczędzi. Ktoś inny korzystający z Twojej aplikacji spotka się z przykrą niespodzianką, gdy nie zorientuje się, że jest kompatybilny tylko z niektórymi systemami plików, a nie innymi. Kolejność może ulec zmianie, jeśli system plików zostanie przywrócony z kopii zapasowej. Prawdopodobnie wystąpią problemy ze zgodnością, ponieważ kolejność zgodna z HFS + i kolejność zgodna z ext4 mogą nie być takie same.
Po prostu przeczytaj wszystkie wpisy katalogu i posortuj listę leksykograficznie przed użyciem. Tak jak
ls
robi.Wspomnieć pliki
a.rb
ib.rb
, ale jeśli mówimy o programowaniu plików źródłowych języka, nie każdy plik powinien już być odpowiedzialny za zapewnienie, że importuje wszystkie zależności?źródło
Wywołanie POSIX w readdir () w Linuksie nie gwarantuje spójnego uporządkowania. Jeśli chcesz uporządkować wyniki, aplikacja obsługująca pliki jest odpowiedzialna za uporządkowanie sposobu, w jaki są prezentowane funkcjom wywołującym.
/programming/8977441/does-readdir-guarantee-an-order
Ponieważ powiedziałeś, że to kod klienta i nie możesz go naprawić, możesz zmienić połączone biblioteki, które służą do zapewnienia spójnego wywołania readdir (). Zajmie to trochę pracy i będzie warte własnego pytania. Szybkie odniesienie do tego można znaleźć na stronie http://www.ibm.com/developerworks/linux/library/l-glibc/index.html .
Zmiana tego może spowodować powstanie całej innej serii problemów, których być może nie będę w stanie przewidzieć. Ostrzegamy Cię, ale może to być rozwiązanie, jeśli Twój klient nie może być odpowiednio wykształcony.
źródło
Poinformuj swojego klienta, że istnieje nieodłączna zależność od zamówienia, którą należy wyraźnie stwierdzić. Zaoferuj, aby pomóc klientowi wyrazić zależność w taki sposób, aby kompilacja działała na wszystkich systemach i aby klient przyjął zmieniony przepływ, który przechwytuje zależność od kolejności kompilacji.
Jeśli klient chce mieć możliwość kompilacji na innych komputerach, byłoby z ich strony przekonywanie, że przychodzi za darmo.
źródło
Współczesny Linux (ext4) dodaje indeks B-drzewa dla list plików. Jednym z jego efektów jest domyślna kolejność plików zależna od skrótu ich nazw.
Aby wyłączyć tę funkcję, użyj:
źródło