2012-01-02 2 views
2

J'ai une configuration comme suit.Mercurial. Contrôle de version et déploiement Différents fichiers de configuration. Comment?

Un référentiel privé sur bitbucket où je conserve le référentiel «maître». Référentiel sur mon serveur qui sert de site Web «en direct». Un référentiel sur mon ordinateur portable qui sert de copie de travail.

Mon processus est le suivant. Je fais une modification à un fichier dans mon référentiel local. Je les commets localement. Je pousse ces changements à bitbucket. Je tire ensuite ces changements de mon bitbucket vers le serveur web. Le problème que j'ai cependant est que ma copie locale utilise différents paramètres de configuration pour les bases de données, les chemins etc, ergo ce que je veux, c'est mon fichier 'config.php' à bitbucket pour contenir les paramètres du serveur, et le config.php sur mon hôte local pour contenir les paramètres locaux. Je crois que cela peut être réalisé avec .hgignore mais je n'ai eu aucun succès de recherche. Le problème que je rencontre est que je fais mon fichier de paramètres de serveur, le pousse sur bitbucket, 'oublie' le fichier dans mon référentiel local, crée un .hgignore, puis recréer le fichier. Cependant quand j'oublie le fichier TortoiseHG remarque et me demande de commettre le changement à bitbucket ....

Toutes les idées seraient grandement appréciées. Remerciements

Points supplémentaires.

En suivant les conseils ci-dessous j'ai développé une configuration comme suit:

J'ai mon dépôt local sur mon ordinateur portable où je fais mes modifications. J'ai bitbucket qui est essentiellement le référentiel 'principal' - si d'autres développeurs rejoignent l'équipe, ils le clonent. J'ai mon référentiel en direct sur mon hébergeur.

Sur mon référentiel en direct, j'ai un fichier .hgignore qui ignore les fichiers de configuration respectifs. En tant que tel quand je fais hg pull de mon hôte, il tire le référentiel comme c'est avec les fichiers de configuration localhost, mais quand je tape hg update (à la copie de travail en direct), ces fichiers sont ignorés/non mis à jour.

Est-ce que quelqu'un pourrait clarifier si j'ai bien compris cela, et si c'est une façon appropriée de réaliser ce que je veux?

Merci

Répondre

5

.hgignore ne tient pas compte uniquement les fichiers si elles ne sont pas versionnées déjà, donc je ne pense pas que votre idée dans la question fonctionnera.

L'approche commune en ce qui concerne la configuration locale est généralement une variation sur le même thème, comme l'un des éléments suivants:

  1. Ne pas vérifier dans le config.php du tout. Vous pouvez enregistrer un config.example.php avec les paramètres les plus courants et documenter dans le README que les utilisateurs doivent copier sur config.php, puis le modifier.

  2. Définissez les paramètres partagés dans config.php et ajoutez une instruction d'inclusion pour pointer vers un fichier non versionné avec des paramètres spécifiques à la machine, par ex. config.local.php. Vous pouvez également fournir un fichier config.local.example.php pour cela.

  3. Comme 2, mais le config.php contient tous les paramètres par défaut et le fichier local a la possibilité de les remplacer.

  4. Vérifiez dans un config.dev.php et config.server.php -file contenant les paramètres pour les deux environnements, et ont un config.php qui comprend un versionnée des fichiers ci-dessus. L'avantage est que les configurations elles-mêmes sont versionnées et vous pouvez les mettre à jour.

Laquelle de ces variantes choisir, ou si vous faites une autre variation, dépend de votre environnement.

+0

Ce que j'ai fait était d'utiliser hg remove pour se débarrasser des fichiers de configuration dans le dépôt cloné qui est ma copie 'live'. J'ai ensuite créé le fichier .hgignore avant de recréer le fichier de configuration. Ma compréhension étant que lorsque je mets à jour, maintenant, à cause du hgignore, il ne mettra pas à jour ces fichiers? Donc, si je comprends bien, je réalise essentiellement la même chose, mais je n'ai pas les avantages des configurations versionnées ... Est-ce exact? Remerciements –

+0

Re. le fichier ignorer, sonne à peu près juste, le phrasé de votre question donnait l'impression que vous attendiez .hgignore de travailler sur un fichier qui a été tiré (et donc versionné), mais si vous le supprimez d'abord, il sera ignoré. Notez cependant que le fichier sera probablement supprimé par la traction, donc vous devez le restaurer après avoir tiré, et à partir de ce moment, cela fonctionnera. –

+0

Re. les options, je pense que vous avez essentiellement fait ce que décrit l'option 1, sauf que je recommanderais de vérifier dans un exemple de configuration pour le rendre plus facile pour les gens à configurer. L'option 1 a une configuration non versionnée (mais un exemple), les options 2 et 3 ont des configurations partiellement versionnées et l'option 4 a des configurations entièrement versionnées. Tout va bien vraiment, tous ont leurs hauts et leurs bas, donc cela dépend de ce que vous voulez faire. –

1

L'idée de base pour travailler avec le contrôle de version et les différents fichiers de configuration est toujours le même, mais je ne sais pas assez PHP pour donner une réponse détaillée comment vous pouvez le faire en PHP.
répondis-je a similar question pour .net/Visual Studio il y a quelques mois, donc je vais vous donner le lien vers cette réponse et essayer de décrire à nouveau l'idée de base, mais cette langue agnostique temps:

Pour votre cas d'utilisation, l'idée de base est d'avoir deux fichiers de configuration dans le référentiel, une avec vos données locales et une avec vos données de serveur, par exemple comme ceci:

config.local.php 
config.server.php 

le « vrai » config.php est pas dans le référentiel , et il devrait être dans .hgignore, donc il jamais sera dans le référentiel soit.Après avoir tiré, vous devez exécuter quelque chose qui copie un de ces fichiers (le "correct" en fonction de l'environnement actuel, local ou serveur) à config.php.

Et exactement cette dernière partie est la partie que je ne peux pas répondre en détail, parce que je ne sais pas comment faire cela en PHP et/ou sur un serveur web parce que je suis un gars .net/Windows . Pour autant que je sache, déployer un site PHP ne fait que copier les fichiers sur le serveur web, donc il n'y a pas d'étape "build/compile" où la copie/renommage du fichier de configuration pourrait être fait (où je le ferais dans .net). Corrigez-moi si je me trompe ...


EDIT:

Thomas, je ne sais pas si je comprends bien vos modifications. Votre référentiel "local" sur votre ordinateur portable et votre référentiel "live" sur votre serveur web sont essentiellement des clones de votre référentiel "principal" sur Bitbucket, n'est-ce pas?
Si oui, dites-vous que vous avez différents fichiers .hgignore dans les différents clones? C'est la partie qui me rend confus.
Peu importe comment vous le faites réellement (il y a plusieurs possibilités de traiter les fichiers de configuration, voir ci-dessous), le fichier .hgignore devrait être le même dans tous les clones de votre dépôt.

Ainsi, tous vos référentiels (quel que soit le clonage sur quelle machine) doivent tous contenir le (s) même (s) fichier (s) de configuration.
Ensuite, vous devez seulement vous assurer que différentes configurations sont utilisées dans différents environnements. Il y a déjà une excellente liste de différentes façons d'y parvenir en Lauren Holst's answer, donc je vais vous y indiquer. Comme Laurens Holst l'a déjà dit, nous ne pouvons pas dire lequel de ces moyens est le meilleur pour vous - cela dépend de votre environnement.

+0

Merci beaucoup pour la suggestion. S'il vous plaît voir mes modifications ci-dessus. Sur le plan conceptuel, cela semble-t-il correct? Merci –

+0

@ThomasClowes: Je ne suis pas sûr. S'il vous plaît lire les clarifications dans ma réponse. –

0

Vous voudrez peut-être vérifier here. Si à la fois le fichier de configuration et .hgignore sont validés, le .hgignore n'aura aucun effet. Vous pouvez également ajouter un chèque de domaine conditionnel:

$domain = $_SERVER['HTTP_HOST']; 
if ($domain=="localhost") { 
    //local copy config 
} 
else if ($domain=="yourdomain.com") { 
    //webserver config 
} 
Questions connexes