Notre projet utilise un fichier de configuration spécifique à l'utilisateur. Ce fichier n'est actuellement pas sous contrôle de version, car il est différent pour chaque utilisateur. Le problème est que, lorsqu'un développeur ajoute un nouveau module nécessitant une configuration ou modifie le nom d'un module existant, les autres développeurs reçoivent des erreurs car leurs fichiers de configuration privés ne sont pas mis à jour.
Pour résoudre le problème, nous avons envisagé de travailler avec deux fichiers de configuration: un fichier de configuration par défaut / global qui sera en contrôle de version et sera mis à jour régulièrement par chaque développeur qui ajoute un nouveau module, et un fichier de configuration privé qui sera conservé. de contrôle de version et ne contiendra que les modifications spécifiques à l'utilisateur.
Cependant, cela semble toujours être une solution ad-hoc.
Pouvez-vous proposer une meilleure solution?
Que font les professionnels?
la source
Réponses:
Bien que vous ayez déjà obtenu de bonnes réponses ici, la plupart d'entre elles ignorent la cause fondamentale de votre problème: vos fichiers de configuration utilisateur semblent contenir plus que des informations spécifiques à l'utilisateur, ils contiennent également (peut-être redondant) des informations sous contrôle de version ailleurs , probablement dans des fichiers différents, comme les noms de modules.
Je peux penser à deux solutions possibles ici:
essayez de séparer cette information rigoureusement. Par exemple, n'utilisez aucun nom de module dans votre configuration utilisateur. Utilisez des identifiants (par exemple, des GUID) pour faire référence à des modules et laissez ces identifiants ne jamais changer après leur affectation à un module. Bien sûr, cela a probablement l’inconvénient que vos fichiers de configuration utilisateur perdent une partie de leur simplicité qu’ils pourraient avoir maintenant. Vous devrez peut-être créer un outil graphique pour modifier vos fichiers de configuration au lieu d'utiliser un éditeur de texte brut.
attribuez un numéro de version à votre format de fichier de configuration et, chaque fois que vous modifiez un nom de module, attribuez-leur un nouveau numéro de version. Vous pouvez ensuite fournir un script de mise à niveau qui vérifie les numéros de version. Si le fichier de configuration n'est pas à jour, il modifie tous les noms de modules trouvés dans le fichier et augmente ensuite le numéro de version. Cela peut être automatisé pour que le processus de mise à niveau ne gêne pas vos collègues dans leur travail quotidien.
EDIT: après avoir relu votre message, je pense que votre solution supposée est raisonnable, tant que de nouveaux modules viennent d’être ajoutés, mais pas renommés. Ce que j'ai écrit ci-dessus va permettre de changer le nom des modules ou la structure de la configuration des modules existants par la suite. Mais si vous n'en avez pas besoin, je me contenterais de la solution la plus simple.
la source
C'est une solution raisonnable.
Vous avez besoin d'un moyen de spécifier les valeurs initiales de tout nouvel élément de configuration. Ceux-ci doivent être stockés quelque part et un fichier de configuration global, en lecture seule, est le choix évident.
Ensuite, lorsque chaque utilisateur modifie sa configuration personnelle, vous écrivez ces modifications sur leur copie locale.
Votre code devra d'abord lire la configuration globale, puis celle spécifique à l'utilisateur pour écraser les valeurs modifiées. Ce sera beaucoup plus simple que de lire le fichier local, puis d'essayer de déterminer ceux qui n'ont pas été définis et qui nécessitent donc une lecture à partir du fichier de paramètres globaux.
Si vous utilisez quelque chose comme XML pour le stockage, vous n'avez pas à vous soucier de la gestion du cas où vous supprimez des paramètres. Ils ne seront pas demandés à la copie utilisateur du fichier. Si vous recréez le fichier lors de la sauvegarde, ils seront supprimés lors de la première utilisation de l'application après la modification.
la source
Nous avons une solution assez intéressante, nous sommes principalement des développeurs PHP, nous utilisons donc Phing qui vous permet de créer des tâches automatisées écrites en PHP. Au lieu de faire notre mise à jour normale de svn, nous faisons une "mise à jour de phing" qui appelle svn update, et remplace ensuite nos configs par les variables appropriées, par exemple, une config:
Ainsi, les fichiers de configuration sont tous versionnés avec cette syntaxe intéressante, puis nous générons un fichier de configuration ad hoc, non versionné pour mon instance spécifique, qui remplace ces "variables" par des paramètres sans version spécifiés dans des fichiers ini non versionnés. De cette façon, nous pouvons modifier tous les fichiers spécifiques à l'utilisateur et faire en sorte que les modifications soient répercutées sur d'autres copies de travail.
la source
Le programme doit avoir un paramètre par défaut dans le code lorsque la valeur n’est pas trouvée dans le fichier de configuration. Ainsi, au fur et à mesure que de nouvelles choses seront ajoutées, votre chemin de mise à niveau sera plus fluide et vos utilisateurs auront la possibilité de se replier lorsqu'ils fouillent également le fichier de configuration.
Un autre exemple plus complexe serait au démarrage du programme ou à un autre point clé, ouvrez le fichier de configuration à l’aide d’un module d’initialisation et ajoutez les valeurs par défaut manquantes, mais cela semble assez lourd.
la source
Mettez un numéro de version dans le fichier de configuration personnel (le numéro de version du format du fichier de configuration).
Assurez-vous que le code qui traite le fichier de configuration personnel vérifie le numéro de version et, s'il est obsolète, exécutez une procédure de mise à jour. Donc, fondamentalement, toute personne qui apporte une modification qui casse les fichiers de configuration existants doit modifier le numéro de version du format du fichier de configuration, et écrire une procédure pour mettre à jour les fichiers de configuration de la version précédente (renommer des sections, etc.) et les enregistrer à nouveau. leur.
De toute façon, vous voudrez probablement de tels processus pour les utilisateurs finaux, alors vous pouvez également les utiliser pour faciliter la vie de vos développeurs.
la source
En règle générale, j'ai constaté qu'un fichier de configuration avec les valeurs par défaut était archivé dans le référentiel. Celles-ci pourraient être, par exemple, les valeurs nécessaires sur le serveur de test. Ensuite, lorsqu'un développeur extrait le fichier, il aura toutes les valeurs. Si un nouveau champ est ajouté ou un champ est supprimé, cela est traité dans une fusion. Un développeur archivera la valeur requise pour le serveur cible et ne archivera aucune autre modification apportée aux champs de son environnement de développement personnel.
Il prend soin de s'assurer que la fusion est bien faite, mais cela me semble plutôt sûr.
la source
Ce que nous faisons ici, c'est créer des blocs de paramètres. Cela peut être fait dans Zend comme ceci:
Cela signifie que les tests héritent de la production et l'étendent avec key3. Il suffit ensuite à chaque développeur de définir son environnement (test ou production dans ce cas)
la source
Ceci est une solution utile basée sur le post: Conserver les mots de passe dans le contrôle de source
En résumé, la stratégie consiste à "conserver une version chiffrée du fichier de configuration dans le contrôle de source, puis à fournir un moyen permettant à l'utilisateur de chiffrer et de déchiffrer ces données".
make decrypt_conf
?");la source
Nous avons construit un outil appelé Config qui gère les problèmes de configuration de ce type. Vous allez créer (ou importer) un fichier de configuration principal. Créez ensuite un environnement appelé Local. Dans l'environnement local, créez plusieurs instances, une instance par utilisateur. Si vous devez effectuer une modification commune, comme l'ajout d'une nouvelle entrée de configuration ou la modification du nom du module, effectuez simplement la modification, qui sera appliquée à tous les niveaux. Si vous souhaitez modifier une instance / un utilisateur, définissez cette valeur de configuration comme une variable, puis modifiez-la. Cette modification ne sera appliquée qu'à votre instance / utilisateur. Tous sont sous contrôle de version. Vous déployez les fichiers de configuration via push ou pull. L'option pull est similaire à git pull, mais pour cette instance / cet utilisateur spécifique.
La configuration vous offre des fonctionnalités supplémentaires telles que la comparaison des configurations entre utilisateurs, la recherche, le balisage, la validation et le workflow. Il s'agit d'un SaaS, donc pas vraiment pour ceux qui ne sont pas encore prêts pour le cloud, mais nous avons un plan sur site.
la source