Comment traitez-vous avec les fichiers de configuration du contrôle de code source?
Disons que vous avez une application web standard et avec un fichier de configuration.quoi que ce soit. Chaque développeur qui travaille sur le projet aura une version pour leurs boîtes de dev, il y aura un dev, prod et le stade versions. Comment faire face à ce contrôle de code source? Cochez pas dans ce fichier, vérifiez avec des noms différents ou de faire quelque chose de fantaisie tout à fait?
Vous devez vous connecter pour publier un commentaire.
Ce que j'ai fait dans le passé, c'est d'avoir un fichier de config par défaut qui est vérifié dans le contrôle de source. Ensuite, chaque développeur dispose de son propre remplacer le fichier config qui est exclu de la source de contrôle. L'application se charge tout d'abord la valeur par défaut, et puis si remplacer le fichier est présent, la charge et utilise tous les paramètres de la remplacer, de préférence à la valeur par défaut du fichier.
En général, le plus petit de remplacer le fichier le mieux, mais il peut toujours contenir plus de paramètres pour un développeur avec un très non-standard de l'environnement.
N'est pas la version de ce fichier. Version d'un modèle ou de quelque chose.
Configuration est code, et vous devez version il. Nous basons nos fichiers de configuration sur les noms d'utilisateur; dans les deux UNIX/Mac et Windows, vous pouvez accéder le nom de l'utilisateur, et aussi longtemps que ces sommes unique pour le projet, vous êtes beaux. Vous pouvez même remplacer ce dans l'environnement, mais vous devrait de contrôle de version tout.
Cela vous permet également d'examiner les autres configurations, ce qui peut aider à diagnostiquer construire et plate-forme de questions.
Mon équipe de garde de séparer les versions des fichiers de configuration pour chaque environnement (site web.config.dev web.config.test, web.config.la prod). Nos scripts de déploiement copie exacte de la version, de la renommer en web.config. De cette façon, nous avons la version complète de contrôle sur les fichiers de configuration pour chaque environnement, peut facilement faire un diff, etc.
Actuellement, j'ai le "modèle" fichier de config ajoutée une extension par exemple:
Cependant, je peux voir un problème avec cette méthode si les changements ont changé.
+1 sur le modèle de l'approche.
Mais depuis que cette question a tag Git, distribué alternative
les ressorts à l'esprit, dans lequel les personnalisations sont tenus en essais privés
branche:
Dans ce schéma, la canalisation principale contient un générique, le "modèle" config
fichier nécessitant un minimum d'ajustements pour devenir fonctionnelle.
Maintenant, les développeurs/testeurs pouvez modifier le fichier de config à cœur
contenu, et n'engagent que ces changements localement sur un privé
branche de test (par exemple, B' = B + personnalisations). Chaque fois que la canalisation principale
avances, sans effort de fusion dans les tests, ce qui entraîne
de fusion s'engage comme D' (= D + version fusionnée de B personnalisations).
Ce schéma brille vraiment quand le "modèle" fichier de config est à jour:
les changements des deux côtés sont fusionnés, et est extrêmement probable
résultat dans les conflits (ou d'échec de test) si elles sont incompatibles!
La solution que nous utilisons est d'avoir un seul fichier de configuration (web.config/app.config), mais nous avons ajouter une section spéciale pour le fichier qui contient les paramètres pour tous les environnements.
Il y a un LOCAL, DEV, QA, la PRODUCTION sections, chacune contenant la configuration des touches, pertinente pour environnement dans notre fichier de configuration(s).
Ce qui fait de cette tout le travail est une assemblée nommée xxx.Environnement qui est référencé dans l'ensemble de nos applications (winforms et webforms) qui indique à l'application de laquelle l'environnement d'exploitation sur.
Le xxx.L'environnement de l'assemblée se lit d'une seule ligne de l'information de la de la machine.config de la machine qui lui indique qu'il est en DEV, QA, etc. Cette entrée est présente sur l'ensemble de nos postes de travail et serveurs.
Espère que cette aide.
J'ai utilisé le modèle d'avant, c'est à dire le web.dev.config, web.prod.config, etc, mais maintenant, préférez l'option " ignorer le fichier de technique. Le web.fichier de configuration contient la majorité des paramètres, mais un fichier externe contient spécifiques à l'environnement des valeurs telles que la db connections. Bonne explication sur Paul Wilson blog.
Je pense que cela réduit la quantité de chevauchement entre les fichiers de configuration qui peuvent causer de la douleur lors de l'ajout de nouveaux attributs /valeurs.
J'ai toujours gardé toutes les versions des fichiers de configuration du contrôle de code source, dans le même dossier que le web.fichier de configuration.
Par exemple
Je préfère cette convention de nommage (par opposition au web.config.de la production ou de la production.web.config) parce que
Le fichier de configuration par défaut doit être configuré de telle sorte que vous pouvez exécuter l'application en local sur votre machine.
Plus important encore, ces fichiers devraient être presque identiques à 100% dans tous les aspects, même mise en forme. Vous ne devriez pas utiliser les onglets en une seule version et des espaces dans un autre pour l'indentation. Vous devriez être en mesure d'exécuter un outil de comparaison avec les fichiers pour voir exactement ce qui est différent entre eux. Je préfère utiliser WinMerge pour la comparaison de fichiers.
Lors de votre processus de génération crée les fichiers binaires, il devrait y avoir une tâche qui remplace le web.config avec le fichier de configuration approprié pour l'environnement. Si les fichiers sont zippés, puis le non pertinentes les fichiers doivent être supprimés à partir de ce build.
@Subvention est de droit.
Je suis sur une équipe de près de 100 autres développeurs, et nos fichiers de config ne sont pas vérifiées dans le contrôle de source. Nous avons des versions des fichiers dans le référentiel tiré avec chaque chèque, mais ils ne changent pas.
C'est très bien pour nous.
Je de contrôle de version, mais sans jamais pousser vers les autres serveurs. Si le serveur de production exige un changement, je fais que de modifier directement le fichier de configuration.
Il peut ne pas être assez, mais il fonctionne très bien.
Le check-in, classiques version de l'app/web.config doit être suffisamment générique pour fonctionner sur tous les ordinateurs de développement, et être mis à jour avec toutes les nouvelles modifications apportées aux paramètres, etc. Si vous avez besoin d'un ensemble de paramètres de dev/test/paramètres de production, vérifier dans des fichiers séparés avec ces paramètres, comme GateKiller a déclaré, avec une sorte de convention de nommage, bien que je l'habitude d'aller avec web".prod.config", comme pour ne pas changer l'extension du fichier.
Nous utilisons un modèle de fichier de configuration qui est contrôlé dans le contrôle de version, puis une étape de plus dans notre système automatisé pour remplacer les entrées dans le fichier de modèle avec l'environnement de paramètres spécifiques. L'environnement spécifique, les paramètres sont stockés dans un fichier XML distinct est également sous le contrôle de version.
Nous sommes à l'aide de MSBuild dans notre génération automatisée, donc nous utilisons le XmlUpdate tâche de MSBuild Missions De La Communauté, de mettre à jour les valeurs.
Pour un long temps, j'ai fait exactement ce que bcwood a fait. J'ai garder des copies de web.dev.config, web.test.config, web.prod.config, etc. sous contrôle de code source, et puis mon build/système de déploiement renomme automatiquement qu'il déploie à différents environnements. Vous obtenez un certain niveau de redondance entre les fichiers (surtout avec tout le asp.net des trucs là), mais en général ça fonctionne vraiment bien. Vous aussi, vous devez assurez-vous que toute l'équipe se souvient de mettre à jour tous les fichiers quand ils font un changement.
En passant, je tiens à garder ".config" à la fin, comme l'extension, ainsi que des associations de fichiers ne sont pas brisés.
Autant que développeur local versions du fichier de config, j'essaie toujours de mon mieux pour encourager les gens à utiliser les mêmes paramètres locaux autant que possible, de sorte qu'il n'est pas besoin d'avoir votre propre version. Il ne fonctionne pas toujours pour tout le monde, auquel cas les gens l'habitude de simplement remplacer localement au besoin et à partir de là. Il n'est pas trop douloureux ou quoi que ce soit.
Sur notre projet, nous avons de configuration stockées dans des fichiers avec un préfixe, puis notre système de construction tire dans la configuration basée sur le système actuel du nom d'hôte. Cela fonctionne bien pour nous sur une équipe relativement petite, ce qui nous permet d'appliquer les modifications de configuration à d'autres fichiers si/lorsque nous ajoutons un nouvel élément de configuration. Évidemment, il n'a pas d'échelle pour les projets open source avec un nombre illimité de développeurs.
Nous avons deux problèmes ici.
Tout d'abord, nous avons pour contrôler le fichier de configuration qui est livré avec le logiciel.
C'est tous les deux facile pour un développeur de vérifier dans un indésirable pour modifier le fichier de configuration maître, s'ils utilisent le même fichier dans la dévolution de l'environnement.
De l'autre côté, si vous avez un fichier de configuration qui est fourni par l'installateur, il est très facile d'oublier d'ajouter un nouveau paramètre, ou de laisser les commentaires de sortir de la synchronisation avec les commentaires dans la transmission de la configuration de fichier.
Nous avons alors le problème que les développeurs ont de garder copie du fichier de configuration à jour que d'autres développeurs d'ajouter de nouveaux paramètres de configuration. Cependant, certains paramètres de la base de données de chaînes de connexion sont différents pour chaque développeur.
Il y a un 3ème difficulté de la question/réponses ne couvre pas. Comment voulez-vous fusionner les modifications d'un client à votre fichier de configuration lorsque vous installez une nouvelle version de votre logiciel?
Tout d'abord de réduire le nombre d'éléments de configuration que vous avez dans votre fichier de configuration principal.
Si vous n'avez pas un besoin pour permettre à vos clients de changer votre mappages, utilisez Couramment NHibernate (ou autre) pour déplacer la configuration dans le code.
De même pour depency configuration d'injection.
Diviser le fichier de configuration lorsque cela est possible, par exemple l'utilisation d'un fichier distinct pour configurer ce Log4Net journaux.
Ne pas répéter des éléments entre les lots de fichiers de configuration, par exemple, si vous avez 4 applications web qui sont installés sur la même machine, avoir un ensemble de fichier de configuration que le web.fichier de config à chaque demande de pointe.
(Utiliser un chemin relatif par défaut, de sorte qu'il est rare d'avoir à changer le web.fichier de config)
Processus de l'élaboration du fichier de configuration pour obtenir la configuration de l'envoi de fichier.
Le pourrait être fait par les valeurs par défaut dans les commentaires Xml qui sont ensuite définies dans le fichier de configuration lorsqu'un build est fait. Ou avoir des sections qui sont supprimés dans le cadre du processus de création du programme d'installation.
Au lieu d'avoir juste une base de données de chaînes de connexion, ont une par les développeurs.
E. g premier coup d'oeil pour “database_ianr” (où ianr est mon nom d'utilisateur ou le nom de la machine) dans le fichier de configuration au moment de l'exécution, si elle n'est pas trouvée, puis recherchez “base de données”
Avoir un 2ème niveau "par exemple, oracle ou sqlserver" de le rendre plus rapide pour les développeurs pour obtenir à la fois des systèmes de base de données.
- Ci peut également être fait pour toute autre valeur de configuration.
Alors toutes les valeurs qui se terminent par “_userName” peut être rayé avant d'expédier le fichier de configuration.
Vous ne pouvez pas supprimer la nécessité pour une personne se souciant peu de ce court de problème.
Je ne pense pas qu'il y a une unique solution qui fonctionne pour tous les cas comme celui-ci peut dépendre de la sensibilité des données dans les fichiers de configuration, ou le langage de programmation que vous utilisez, et de nombreux autres facteurs. Mais je pense qu'il est important de garder les fichiers de configuration pour tous les environnements sous contrôle de code source, de sorte que vous pouvez toujours savoir quand elle a été modifiée, et par qui, et surtout, être en mesure de le récupérer si les choses tournent mal. Et ils le feront.
Alors, voici comment je le fais. C'est pour nodejs projets d'habitude mais je pense que cela fonctionne pour les autres cadres et des langues.
Ce que j'ai à faire est de créer un
configs
répertoire à la racine du projet, et dans ce répertoire conserver de multiples fichiers pour tous les environnements (et quelques fois des fichiers distincts pour chaque développeur de l'environnement), qui sont suivis dans le contrôle de source. Et il y a un fichier qui utilise le code nomméconfig
à la racine du projet. C'est le seul fichier qui n'est pas suivi. Donc, il semble que ceQuand quelqu'un vérifie le projet, il copie le fichier de configuration qu'il souhaite utiliser dans le sans traces
config
fichier et il est libre de le modifier comme il le souhaite, mais est également responsable de copier ces changements avant qu'il s'engage à les autres fichiers d'environnement en tant que de besoin.Et sur les serveurs, les sans traces de fichier peut être simplement une copie (ou de référence) du fichier suivi correspondant à celle de l'environnement. En JS vous pouvez tout simplement avoir 1 ligne d'exiger que la fichier.
Ce flux peut être un peu compliqué au premier abord, mais il a de grands avantages:
1. Vous n'avez jamais à vous soucier d'un fichier de config se faire supprimé ou modifié sur le serveur sans avoir une sauvegarde
2. Même si un développeur a certains de configuration personnalisé sur sa machine et la machine s'arrête de fonctionner pour une raison quelconque
3. Avant tout déploiement, vous pouvez diff les fichiers de configuration pour
development
etstaging
par exemple et voir si il y a quelque chose de brisé ou manquant.Que nous venons de continuer la production du fichier de config de la rentrée. Il est de la responsabilité du développeur de modifier le fichier quand ils sortir de source sécuritaire pour la mise en scène ou de développement. Ce qui a brûlé dans le passé je ne voudrais pas suggérer.
J'ai fait face à ce même problème et j'ai trouvé une solution pour elle. J'ai d'abord ajouté tous les fichiers vers le dépôt central (qui est aussi le développeur de ceux).
Donc, si un développeur récupère les fichiers à partir du référentiel le développeur config est là aussi. Lors de la modification apportées à ce fichier, Git ne doit pas être au courant de ces changements. De cette façon, les modifications ne peuvent pas être poussé/engagé dans le référentiel, mais rester à l'localement.
J'ai résolu ce problème en utilisant la commande git:
update-index --assume-unchanged
. J'ai fait un fichier bat qui est exécuté dans le paquetage des projets contenant un fichier dont les modifications doivent être ignorer par Git. Voici le code que j'ai mis dans le fichier bat:Dans mon paquetage, je voudrais faire appel à la chauve-souris de fichier, par exemple:
Que j'ai trouvé sur SI un fichier bat qui copie le bon fichier de config pour le web.config/app.config. J'ai aussi appeler ce fichier bat dans le paquetage. Le code de ce fichier bat est:
Dans mon paquetage, je voudrais faire appel à la chauve-souris de fichier, par exemple: