Я управляю компанией по непрерывной интеграции , и мы запускаем код наших клиентов в Linux. Каждый раз, когда мы запускаем код, мы запускаем его на отдельной виртуальной машине. Частая проблема, которая возникает, заключается в том, что пользовательские тесты иногда не выполняются из-за упорядочения каталога их кода, проверенного на виртуальной машине.
Позвольте мне перейти к более подробно. В OSX файловая система HFS + гарантирует, что каталоги всегда перемещаются в одном и том же порядке. Программисты, использующие OSX, предполагают, что если он работает на их компьютере, он должен работать везде. Но это часто не работает в Linux, потому что файловые системы Linux не предлагают гарантий упорядочения при обходе каталогов.
В качестве примера рассмотрим 2 файла: a.rb, b.rb. a.rb определяет MyObject
, а b.rb использует MyObject
. Если a.rb загружается первым, все будет работать. Если b.rb загружается первым, он попытается получить доступ к неопределенной переменной MyObject
и потерпит неудачу.
Но что еще хуже, это то, что он не всегда просто терпит неудачу. Поскольку порядок файловой системы в Linux не упорядочен, это будет другой порядок на разных машинах. Это хуже, потому что иногда тесты проходят, а иногда они не проходят. Это худший из возможных результатов.
Итак, мой вопрос, есть ли способ сделать порядок файловой системы повторяемым. Может быть, есть какой-то флаг в ext4, который говорит, что он всегда будет проходить каталоги в каком-то порядке? Или, может быть, другая файловая система, которая имеет эту гарантию?
источник
Ответы:
Я знаю, что это не тот ответ, который вы ищете, но я считаю, что правильное решение - избегать зависимости от порядка файлов в каталоге. Может быть, он всегда одинаков для всех файловых систем HFS +, и, возможно, вы сможете найти способ сделать его согласованным в ext4 или другой файловой системе, но в долгосрочной перспективе это будет стоить вам больше хлопот, чем спасет. Кто-то, кто использует ваше приложение, может удивиться, когда не поймет, что оно совместимо только с некоторыми типами файловых систем, а не с другими. Порядок может измениться, если файловая система будет восстановлена из резервной копии. Вероятно, вы столкнетесь с проблемами совместимости, поскольку согласованный порядок HFS + и согласованный порядок ext4 могут не совпадать.
Просто прочитайте все записи каталога и рассортируйте список лексикографически перед использованием. Так же, как и
ls
делает.Вы упоминаете файлы
a.rb
иb.rb
, но если мы говорим об исходных файлах языка программирования, не должен ли каждый файл уже отвечать за то, чтобы он импортировал все свои зависимости?источник
Вызов POSIX в Linux readdir () не гарантирует какого-либо последовательного упорядочения. Если вам нужны упорядоченные результаты, приложение, обрабатывающее файлы, отвечает за порядок их представления вызывающим функциям.
/programming/8977441/does-readdir-guarantee-an-order
Теперь, поскольку вы сказали, что это код вашего клиента, и вы не можете его исправить, вы можете изменить связанные библиотеки, которые используются для обеспечения согласованного вызова readdir (). Это заняло бы некоторую работу и стоило бы своего собственного вопроса. Для быстрой ссылки на это см. Http://www.ibm.com/developerworks/linux/library/l-glibc/index.html .
Изменение этого может породить некоторые другие целые серии проблем, которые я, возможно, не смогу предвидеть. Вас настоятельно предупреждают, но это может быть решением, если ваш клиент не может быть должным образом обучен.
источник
Обучите своего клиента, что есть внутренняя зависимость заказа, которая должна быть четко указана. Предложите клиенту помочь выразить зависимость таким образом, чтобы компиляция работала на всех системах, и чтобы клиент принял измененный поток, который фиксирует зависимость порядка компиляции.
Если клиент хочет иметь возможность компилировать на других машинах, он считает, что это бесплатно.
источник
Современный Linux (ext4) добавляет индекс B-дерева для списков файлов. Одним из его эффектов является порядок файлов по умолчанию, который зависит от хэша их имен.
Чтобы отключить эту функцию, используйте:
источник