Problème D'Origine
Dans la construction de nos projets, je veux mercurial id de chaque référentiel pour être incorporé dans le produit(s) de ce référentiel (la bibliothèque, de l'application ou de l'application de test).
Je trouve cela rend les choses beaucoup plus facile à déboguer une application en cours d'exécution par les clients 8 fuseaux horaires de là, si vous savez précisément ce qui s'est passé dans la construction de la version de l'application qu'ils utilisent. En tant que tel, chaque projet (application ou de la bibliothèque) dans nos systèmes met en œuvre un moyen de mise à la modification de l'information.
Je trouve aussi qu'il est très utile d'être en mesure de voir si une application a été compilée avec propre (non modifié) les modifications du référentiel. Hg id' utilement ajoute un + à l'id de révision lorsqu'il y a des modifications non validées dans un dépôt, donc cela nous permet de voir facilement si les gens sont en cours d'exécution d'un chiffon propre ou une version modifiée du code.
Ma solution actuelle est détaillée ci-dessous, et remplit les exigences de base, mais il y a un certain nombre de problèmes.
Solution Actuelle
À l'heure actuelle, pour chaque solution Visual Studio, j'ajoute à la suite de "Pré-événement de construction de la ligne de commande" des commandes:
cd $(ProjectDir)
HgID
J'ai aussi ajouter un HgID.fichier bat dans le répertoire de Projet:
@echo off
type HgId.pre > HgId.cs
For /F "delims=" %%a in ('hg id') Do <nul >>HgID.cs set /p = @"%%a"
echo ; >> HgId.cs
echo } >> HgId.cs
echo } >> HgId.cs
avec un HgId.pré fichier, qui est définie comme:
namespace My.Namespace {
/// <summary> Auto generated Mercurial ID class. </summary>
internal class HgID {
/// <summary> Mercurial version ID [+ is modified] [Named branch]</summary>
public const string Version =
Quand j'ai créer mon application, la pré-construction de l'événement est déclenché sur toutes les bibliothèques, la création d'un nouveau HgId.cs fichier (qui n'est pas sous le contrôle de révision) et provoquant la bibliothèque pour être re-compilé avec la nouvelle hg id' chaîne 'Version'.
Problèmes avec la solution actuelle
Le principal problème est que, depuis la HgId.cs est recréé à chaque pré-construction, donc à chaque fois que nous avons besoin de compiler quoi que ce soit, tous les projets de la solution en cours de re-compilé. Puisque nous voulons être en mesure de résoudre facilement dans nos bibliothèques, nous avons l'habitude de garder de nombreuses bibliothèques référencé dans notre application principale solution. Cela peut entraîner un temps de construire qui sont significativement plus longtemps que je le voudrais.
Idéalement, j'aimerais que les bibliothèques de compiler uniquement si le contenu de la HgId.cs fichier ont effectivement changé, plutôt que d'avoir été re-créé avec exactement le même contenu.
Le deuxième problème avec cette méthode c'est que c'est la dépendance sur le comportement spécifique de l'environnement windows. J'ai déjà eu à modifier le fichier de commandes à plusieurs reprises, depuis l'origine a travaillé sous XP, mais pas Vista, la prochaine version travaillé sous Vista, mais pas XP et j'ai enfin réussi à le faire fonctionner avec les deux. Si cela va fonctionner avec Windows 7, cependant, est anyones deviner et à mesure que le temps passe, je vois qu'il est plus probable que les entrepreneurs s'attendent à être en mesure de construire nos applications sur Windows 7 boxen.
Enfin, j'ai un problème esthétique avec cette solution, les fichiers de commandes et bodged ensemble des fichiers de modèle se sentir comme de la mauvaise façon de le faire.
Mes questions
Comment résoudriez-vous/comment allez-vous résoudre le problème, je vais essayer de résoudre?
Ce que de meilleures options là-bas que ce que je suis en train de faire?
Rejeté les Solutions à ces problèmes
Avant j'ai mis en place la solution actuelle, j'ai regardé la Mercuriels mot-Clé de l'extension, car il semblait être la solution la plus évidente. Cependant, plus je l'ai regardé et lu les peuples opinion, d'autant plus que je suis venu à la conclusion que ce n'était pas la bonne chose à faire.
Je me souviens aussi des problèmes de substitution de mot clé m'a causé dans les projets précédents entreprises (juste la pensée de ne jamais avoir à utiliser de Source Sécuritaire à nouveau me remplit d'un sentiment d'effroi *8').
Aussi, je n'ai pas particulièrement envie d'activer Mercurial extensions pour obtenir la génération complète. Je veux la solution pour être autonome, de sorte qu'il n'est pas facile pour que la demande soit accidentellement compilé sans la version embarquée de l'information tout simplement parce qu'une extension n'est pas activée ou le droit helper logiciel n'a pas été installé.
J'ai aussi pensé à écrit ceci dans un meilleur langage de script, celui où je tiens seulement à écrire HgId.cs fichier si le contenu avait réellement changé, mais toutes les options que je pouvais penser, aurait besoin de mes co-travailleurs, les entrepreneurs et éventuellement les clients à avoir à installer de logiciel qu'ils pourraient autrement ne pas vouloir (par exemple cygwin).
Toutes les autres options de gens peuvent penser de serait appréciée.
Mise à jour
Solution partielle
Après avoir joué avec lui pendant un certain temps, j'ai réussi à obtenir le HgId.le fichier bat pour n'écraser la HgId.cs fichier en cas de changement:
@echo off
type HgId.pre > HgId.cst
For /F "delims=" %%a in ('hg id') Do <nul >>HgId.cst set /p = @"%%a"
echo ; >> HgId.cst
echo } >> HgId.cst
echo } >> HgId.cst
fc HgId.cs HgId.cst >NUL
if %errorlevel%==0 goto :ok
copy HgId.cst HgId.cs
:ok
del HgId.cst
Des problèmes avec cette solution
Même si HgId.cs n'est plus re-créé à chaque fois, Visual Studio insiste encore sur la compilation de tout ce à chaque fois. J'ai essayé de chercher des solutions et essayé de vérifier "Seulement de construire des projets de démarrage et dépendances sur Exécuter" dans Outils|Options|Projets et Solutions|Construire et Exécuter, mais il ne fait aucune différence.
Le deuxième problème reste aussi, et maintenant je n'ai aucun moyen de tester si cela fonctionne avec Vista, depuis que l'entrepreneur n'est plus avec nous.
- Si quelqu'un peut tester ce fichier de commandes sur un ordinateur Windows 7 et/ou Vista boîte, j'aimerais connaître comment ça s'est passé.
Enfin, mon problème esthétique avec cette solution, est d'autant plus fort qu'il ne l'était avant, depuis le fichier de commandes est plus complexe et il est maintenant plus à aller mal.
Si vous pouvez penser à une meilleure des solutions, j'aimerais entendre parler d'eux.