确保 linux 中可重复的目录排序

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.rbb.rb,但是如果我们谈论的是编程语言源文件,那么每个文件不应该已经负责确保它导入所有依赖项吗?

  • @PaulBiggar:但是“它在这里运行但不在生产中”**正是 CI 应该解决的问题吗?换句话说:“为什么我的代码在你的系统中被破坏了?” 应该回答“因为我们正在做*完全*您要求我们做的事情!” ;-) (10认同)
  • 我不知道其他任何人,但是当代码在我的机器上运行,然后在 CI 或同事的结帐上失败时,我立即认为有一些依赖于平台或环境的东西需要修复...... (4认同)
  • 我不同意。我认为这是一个很棒的主意。在从开发服务器转移到测试服务器的过程中,它会出现更多的故障。因此,代码在移动到生产服务器之前更加坚固。因此,在正确的或理论的世界中,它要好得多。这是同一个世界,您可以强迫每个人编写正确的代码,也称为梦境。 (2认同)

Jef*_*and 6

Linux readdir() 中的 POSIX 调用不保证任何一致的顺序。如果您想要有序的结果,处理文件的应用程序负责对它们如何呈现给调用函数进行排序。

/sf/ask/628420901/

现在,既然您说这是您客户的代码并且您无法修复它,您可能会更改用于提供一致 readdir() 调用的链接库。这需要一些工作,值得提出自己的问题。要快速参考,请参阅http://www.ibm.com/developerworks/linux/library/l-glibc/index.html

改变这一点可能会产生一些我可能无法预见的其他整个系列问题。强烈警告您,但如果您的客户没有得到适当的教育,这可能是一个解决方案。