Je dirige une entreprise d' intégration continue hébergée et nous exécutons le code de nos clients sur Linux. Chaque fois que nous exécutons le code, nous l'exécutons dans une machine virtuelle distincte. Un problème fréquent qui se pose est que les tests d'un client échouent parfois en raison de la commande d'annuaire de leur code extrait sur la machine virtuelle.
Permettez-moi d'aller plus en détail. Sous OSX, le système de fichiers HFS + garantit que les répertoires sont toujours parcourus dans le même ordre. Les programmeurs qui utilisent OSX supposent que si cela fonctionne sur leur machine, cela doit fonctionner partout. Mais souvent, cela ne fonctionne pas sous Linux, car les systèmes de fichiers linux n'offrent pas de garanties de commande lors de la traversée des répertoires.
À titre d'exemple, considérons qu'il existe 2 fichiers, a.rb, b.rb. a.rb définit MyObject
et b.rb utilise MyObject
. Si a.rb est chargé en premier, tout fonctionnera. Si b.rb est chargé en premier, il essaiera d'accéder à une variable non définie MyObject
et échouera.
Mais pire que cela, c'est qu'il n'échoue pas toujours. Parce que la commande du système de fichiers sous Linux n'est pas ordonnée, ce sera un ordre différent sur différentes machines. C'est pire parce que parfois les tests réussissent, et parfois ils échouent. C'est le pire résultat possible.
Ma question est donc la suivante: existe-t-il un moyen de rendre la commande du système de fichiers reproductible? Un drapeau vers ext4 peut-être, qui dit qu'il traversera toujours les répertoires dans un certain ordre? Ou peut-être un système de fichiers différent qui a cette garantie?
la source
Réponses:
Je sais que ce n'est pas la réponse que vous cherchez, mais je crois que la bonne solution est d' éviter de dépendre de l'ordre des fichiers dans un répertoire. Peut-être qu'il est toujours cohérent dans tous les systèmes de fichiers HFS +, et peut-être pourriez-vous trouver un moyen de le rendre cohérent dans ext4 ou dans un autre système de fichiers, mais cela vous coûtera plus de problèmes à long terme qu'il n'en économisera. Quelqu'un d'autre utilisant votre application sera surpris par une mauvaise surprise lorsqu'il ne réalisera pas qu'il est compatible uniquement avec certains types de systèmes de fichiers et pas avec d'autres. L'ordre peut changer si un système de fichiers est restauré à partir de la sauvegarde. Vous rencontrerez probablement des problèmes de compatibilité car l'ordre cohérent HFS + et l'ordre cohérent ext4 peuvent ne pas être les mêmes.
Il vous suffit de lire toutes les entrées du répertoire et de trier la liste lexicographiquement avant de l'utiliser. Tout comme le
ls
fait.Vous parlez de fichiers
a.rb
etb.rb
, mais si nous parlons de fichiers source de langage de programmation, chaque fichier ne devrait-il pas déjà être chargé de s'assurer qu'il importe toutes ses dépendances?la source
L'appel POSIX dans Linux readdir () ne garantit aucun ordre cohérent. Si vous voulez des résultats ordonnés, l'application qui gère les fichiers est responsable de l'ordre dans lequel ils sont présentés aux fonctions appelantes.
/programming/8977441/does-readdir-guarantee-an-order
Maintenant, puisque vous avez dit qu'il s'agissait du code de votre client et que vous ne pouvez pas le corriger, vous pouvez éventuellement modifier les bibliothèques liées qui sont utilisées pour fournir un appel readdir () cohérent. Cela demanderait du travail et mériterait sa propre question. Pour une référence rapide à cela, voir http://www.ibm.com/developerworks/linux/library/l-glibc/index.html .
Modifier cela pourrait engendrer d'autres séries entières de problèmes que je ne peux pas prévoir. Vous êtes fortement averti, mais cela peut être une solution si votre client ne peut pas être correctement formé.
la source
Informez votre client qu'il existe une dépendance inhérente aux commandes qui doit être explicitement indiquée. Offrez d'aider le client à exprimer la dépendance de telle manière qu'une compilation fonctionne sur tous les systèmes et demandez au client d'adopter le flux modifié qui capture la dépendance de l'ordre de compilation.
Si le client veut être capable de compiler sur d'autres machines, il serait difficile pour lui de penser que c'est gratuit.
la source
Linux moderne (ext4) ajoute un index B-tree pour les listes de fichiers. L'un de ses effets est que l'ordre des fichiers par défaut dépend du hachage de leurs noms.
Pour désactiver cette fonctionnalité, utilisez:
la source