Pau*_*gar 18 linux filesystems ext4 directory
我经营着一家托管的持续集成公司,我们在 Linux 上运行客户的代码。每次运行代码时,我们都会在单独的虚拟机中运行它。经常出现的一个问题是,客户的测试有时会因为在 VM 上检出的代码的目录顺序而失败。
让我更详细地介绍一下。在 OSX 上,HFS+ 文件系统确保目录总是以相同的顺序遍历。使用 OSX 的程序员假设,如果它在他们的机器上运行,它必须在任何地方运行。但它通常不适用于 Linux,因为 linux 文件系统在遍历目录时不提供排序保证。
例如,假设有 2 个文件,a.rb,b.rb。a.rb 定义MyObject,b.rb 使用MyObject. 如果首先加载 a.rb,一切都会正常。如果首先加载 b.rb ,它将尝试访问未定义的变量MyObject,并失败。
但比这更糟糕的是,它并不总是失败。因为Linux上的文件系统排序是没有顺序的,所以在不同的机器上会是不同的顺序。这更糟糕,因为有时测试通过,有时失败。这是最糟糕的结果。
所以我的问题是,有没有办法使文件系统排序可重复。可能是 ext4 的一些标志,表示它将始终以某种顺序遍历目录?或者可能是具有此保证的不同文件系统?
Cel*_*ada 16
我知道这不是您要寻找的答案,但我相信正确的解决方案是避免依赖于目录中文件的顺序。也许它在所有 HFS+ 文件系统中始终保持一致,也许您可以找到一种方法使其在 ext4 或其他一些文件系统中保持一致,但从长远来看,这将比节省的麻烦更多。当其他使用您的应用程序的人没有意识到它仅与某些类型的文件系统兼容而不与其他类型的文件系统兼容时,他们会遇到令人讨厌的惊喜。如果文件系统从备份中恢复,顺序可能会改变。您可能会遇到兼容性问题,因为 HFS+ 一致顺序和 ext4 一致顺序可能不同。
在使用它之前,只需阅读所有目录条目并按字典顺序对列表进行排序。就像那样ls。
您提到了 filesa.rb和b.rb,但是如果我们谈论的是编程语言源文件,那么每个文件不应该已经负责确保它导入所有依赖项吗?
Linux readdir() 中的 POSIX 调用不保证任何一致的顺序。如果您想要有序的结果,处理文件的应用程序负责对它们如何呈现给调用函数进行排序。
现在,既然您说这是您客户的代码并且您无法修复它,您可能会更改用于提供一致 readdir() 调用的链接库。这需要一些工作,值得提出自己的问题。要快速参考,请参阅http://www.ibm.com/developerworks/linux/library/l-glibc/index.html。
改变这一点可能会产生一些我可能无法预见的其他整个系列问题。强烈警告您,但如果您的客户没有得到适当的教育,这可能是一个解决方案。
| 归档时间: |
|
| 查看次数: |
2817 次 |
| 最近记录: |