Contrôle de version et fichier de configuration personnel

36

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?

Erel Segal-Halevi
la source
4
Boggle ... Pourquoi permettez-vous même aux développeurs de renommer des modules et de casser la configuration client à tout moment autre qu'une mise à niveau majeure ?
Mark Booth
@jk oui, il y a même un meilleur match: stackoverflow.com/questions/1974886/…
Erel Segal-Halevi
Je suis perplexe. Comment est-ce pas un problème lorsque vous installez des mises à niveau.
Josué
6
Ce n'est pas une solution ad hoc du tout. Le fichier de configuration principal vit dans le contrôle de version, remplacé comme l'exigent les fichiers de configuration spécifiques à l'utilisateur. Bien entendu, la quantité de configuration spécifique à l'utilisateur doit être minimisée, mais une petite quantité peut être inévitable.
William Payne

Réponses:

22

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.

Doc Brown
la source
11

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.

ChrisF
la source
3

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:

$db_user = "${test.db_user}";

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.

Dan LaManna
la source
2

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.

Bill Leeper
la source
+1 pour mentionner qu'il ne s'agit pas uniquement d'un problème pour les développeurs, mais d'un problème de déploiement général.
Sleske
2

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.

Carson63000
la source
1

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.

Thomas Owens
la source
Cela semble plutôt sujet aux erreurs; C'est ce que j'ai vu, mais les développeurs ont continué à vérifier accidentellement leurs paramètres personnels, ce qui a alors remplacé les paramètres utilisés par les autres développeurs :-(. peu commode
sleske
@sleske Cela demande une certaine discipline. Mais honnêtement, je m'attendrais à ce que la plupart des développeurs puissent faire cela très bien.
Thomas Owens
1

Ce que nous faisons ici, c'est créer des blocs de paramètres. Cela peut être fait dans Zend comme ceci:

[production]
key1: parameter1
key2: parameter2

[testing: production]
key1: parameter2
key3: parameter4

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)

Agilix
la source
Les paramètres sont plus spécifiques à l'utilisateur. Ils comprennent des éléments tels que les dossiers d'installation des applications, les préférences personnelles, etc. Il ne suffit donc pas de choisir entre deux environnements prédéfinis.
Erel Segal-Halevi
En fonction du nombre de paramètres et de leur utilisation, vous pouvez utiliser les ressources du fichier ini pour Zend. Vous ne savez pas si cela s'applique également à votre problème.
Agilix
J'avais besoin d'une solution plus générale, capable de gérer tous les types de préférences spécifiques à l'utilisateur, pas seulement les ressources.
Erel Segal-Halevi
Juste une pensée ici, mais ne serait-il pas préférable de les stocker dans une base de données? Au moins les préférences. Et ensuite, vous pouvez coupler ceux-ci à l'utilisateur. Sinon, c'était juste une pensée;)
Agilix
0

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".

  1. Créez un fichier fictif et corrigez-le.
  2. Créer un fichier make qui peut chiffrer et déchiffrer le fichier de configuration
  3. Stocker le makefile et le fichier de configuration chiffré dans le référentiel
  4. Le makefile demande un mot de passe et comment contacter l'auteur pour obtenir le mot de passe.
  5. Lors de la construction du projet, si le fichier Make n'a pas été exécuté, avertissez l'utilisateur avec console.error ("Fichier de configuration [conf / settings.json] manquant! Vous avez oublié de lancer make decrypt_conf?");
  6. Une vérification est décrite pour s'assurer que le fichier de configuration est à jour.
Surdité
la source
1
-1 puisque cela ne répond pas du tout à la question initiale. De plus, les réponses qui ne sont rien de plus qu'un lien et aucune explication ne sont pas utiles pour le format Q / A de Stack Exchange, car les liens externes risquent de disparaître à un moment donné, ne laissant aucune référence à la nature de la réponse suggérée.
Derek
1
Ceci est un post intéressant cependant.
Erel Segal-Halevi
0

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.

Bienvenido David
la source
Je pense qu'inclure un SaaS pour gérer la configuration des développeurs serait excessif ... Mais c'est juste, comme, à mon avis. En outre, si la configuration contient des données sensibles (ce qui est peu probable, car il s'agit probablement de tester sur leurs propres postes de travail), c'est instantanément impossible.
Mael
Je ne pense pas que Config soit exagéré si l’on considère la facilité de configuration par rapport au temps passé à essayer de trouver la solution, à demander à la communauté, à la mettre en œuvre et à la maintenir. Config fonctionne sur n’importe quelle plate-forme, format, langue, bibliothèque, de sorte que vous ne l’apprenez qu’une fois. Sur les données sensibles, il existe une option de cryptage côté client, un coffre-fort local si vous voulez. Les utilisateurs qui acceptent tout peuvent installer ou utiliser un VPC.
Bienvenido David