web-dev-qa-db-fra.com

Comment gérer les fichiers de configuration lors d'une collaboration?

J'écris un court script avec quelques variables simples en haut de la page. Je veux y travailler avec un ami, mais nous ne savons pas exactement comment gérer les variables qui doivent être changées après avoir extrait chaque fois pour l'un d'entre nous, ce qui ajoute des fichiers inutiles au statut de git. J'ai pensé créer simplement différentes branches nommées pour chacun de nous, puis le maître n'aura que des exemples de noms d'utilisateur, mais il semble ridicule de devoir fusionner tout ce travail supplémentaire. Les variables pourraient être transmises au script en tant qu'options, mais cela n'est ni souhaité, ni séparé dans un autre fichier de configuration séparé. Ce serait génial d'avoir quelque chose comme un .gitignore mais de ne ignorer que quelques lignes dans un fichier.

Comment cela peut-il être géré avec élégance? Comment ce problème est-il généralement géré?

53
Gitter

Je crains que vous ne puissiez pas simplement ignorer les modifications apportées à des lignes particulières d'un fichier, vous êtes donc probablement coincé avec un fichier de configuration séparé. Ci-dessous, j'ai énuméré deux manières typiques de traiter ce problème et une solution légèrement plus exotique:

Avoir un exemple de fichier de configuration dans git

Ici, vous garderiez un fichier config.sample dans git à titre d'exemple, mais l'application utiliserait en réalité les valeurs d'un fichier config qui se trouve dans .gitignore. L'application produirait alors une erreur à moins que config soit présent. N'oubliez pas de modifier les valeurs du fichier exemple lorsque vous ajoutez de nouvelles variables de configuration à votre fichier config personnel. Dans ce cas, il est également judicieux de demander à votre application de vérifier que toutes les variables de configuration requises sont réellement définies, au cas où quelqu'un aurait oublié de mettre à jour leur fichier config après les modifications apportées à l'exemple.

Avoir un fichier de valeurs par défaut dans git

Vous conservez un fichier config.defaults dans git, qui contient autant que possible des valeurs de configuration par défaut sensibles. Votre application utilise d'abord la configuration de config.defaults, puis de config (qui se trouve dans .gitignore) pour éventuellement remplacer l'une des valeurs par défaut. Avec cette méthode, vous ne feriez généralement pas une erreur si config n'existe pas. L'application peut donc fonctionner immédiatement pour les personnes qui n'ont pas pris la peine de créer config.

Utilisation d'un seul fichier de configuration avec --assume-unchanged

Une troisième possibilité, que je ne recommanderais pas personnellement dans ce cas, serait de ne disposer que d’un seul fichier de configuration validé dans git, mais d’utiliser git update-index --assume-unchanged <FILE> pour indiquer à git d’ignorer les modifications qui y sont apportées. (Ceci est décrit plus en détail dans cet article de blog utile .) Cela signifie que vos modifications locales dans le fichier de configuration ne seront pas validées avec git commit -a ni affichées dans git status.

60
Mark Longair

La solution spécifique à Python/Django consiste à avoir un fichier settings.py partagé qui est archivé dans le référentiel et un settings_local.py local importé à la fin de settings.py, qui remplace certains paramètres avec des valeurs spécifiques à la machine.

5
Tomasz Zielinski

Dans mon cas, j'ai les variables "config" dans un (petit) fichier séparé, comme tous les autres développeurs de l'équipe. Des choses comme l'emplacement de ma base de données, etc. y sont conservées. Nous avons mis le nom de ce fichier dans notre .gitignore afin qu'il ne soit pas contrôlé par la version mais qu'il soit archivé dans un fichier "sample_config" afin que les nouveaux arrivants puissent en faire une copie et l'utiliser à leurs propres fins. 

4
Noufal Ibrahim

Autres options (pas élégant mais peut être utile):

  • Utilisez git stash et git stash pop pour votre fichier de configuration
  • Avoir une branche nommée, par exemple, config qui contient les modifications de votre fichier de configuration local, puis utiliser git checkout config <your config file>

La deuxième option est utile si vous devez conserver les modifications de configuration locales dans le référentiel (quelque part).

2
Mick Kelly

Aujourd'hui, j'utilise par exemple des vars ENV dans python/Django, vous pouvez également leur ajouter des valeurs par défaut. Dans le contexte de docker, je peux enregistrer les vars ENV dans un fichier docker-compose.yml ou un fichier supplémentaire ignoré dans le contrôle de version. 

# settings.py
import os
DEBUG = os.getenv('Django_DEBUG') == 'True'
EMAIL_Host = os.environ.get('Django_EMAIL_Host', 'localhost')
0
yvess

J'ai quelques courts scripts comme celui-ci et au lieu de créer un fichier de configuration séparé, je crée un fichier setenv.sh (ou setenv.bat) distinct. Je déplace les quelques variables simples vers ce nouveau fichier et appelle le fichier setenv.sh dans le script principal. Les variables qui ne changeront pas par utilisateur restent dans le script principal. En fonction de la taille réduite de ce script setenv.sh, je rédigerai une documentation sur la création de ce fichier setenv.sh ou je validerai qu'un setenv.sh.sample sera utilisé comme modèle.

Une variante à ceci n'est pas de créer ou d'appeler un setenv.sh, et de laisser l'utilisateur définir les variables d'environnement utilisées dans le script principal. Le script principal se plaindra si les variables n'existent pas.

Certains scripts courts deviennent de gros scripts ou deviennent des applications à part entière. Lorsque cela se produit, je passe par le chemin des fichiers de configuration. Nous avons une application qui gère les fichiers de configuration appelés Config, à l’adresse http://www.configapp.com . Config a le concept d'environnements et d'instances. Dans votre exemple, vous avez 1 environnement local et 2 instances. Les variables communes vont dans l'environnement local et les variables spécifiques à la machine (vous et votre ami) vont dans les instances. C'est un peu trop pour les petits scripts mais fonctionne bien pour les applications.

0
Bienvenido David