Question

Je lis l'article de John Robbins TFS 2010 Numéro de build et de l'Assemblée des versions de fichier: complètement Sync avec seulement 4.0 msbuild et Je me demande sur la meilleure façon de s'y prendre pour intégrer cela.

Le téléchargement de l'article a deux fichiers, l'un est un fichier de cibles et un est un fichier proj.

Le fichier cible a un certain nombre de tâches à Grattez un numéro de build basé sur le numéro de build Tfs (même celui utilisé pour les builds) et d'écrire ce numéro vers un emplacement (appeler BuildNumberFile) pour la consommation par d'autres proj fichiers.

Le fichier proj est très simple. Il importe que le fichier mentionné ci-dessus des cibles, et déclare alors une cible avec le nom « All », tout en déclarant DefaultTargets sur l'élément du projet devant être Tout aussi bien.

    <Project ToolsVersion="4.0" DefaultTargets="All" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
        <PropertyGroup>
            <!-- The two required properties so the Wintellect.TFSBuildNumber tasks knows your major and minor values.-->
            <TFSMajorBuildNumber>3</TFSMajorBuildNumber>
            <TFSMinorBuildNumber>1</TFSMinorBuildNumber>
        </PropertyGroup>

        <Import Project="Wintellect.TFSBuildNumber.targets"/>

        <!-- Just ask for the version information files you need. These are here to show all the diffent ones in 
           Wintellect.TFSBuildNumber.Targets. You can change the names -->
        <Target Name="All"
              DependsOnTargets="WriteSharedCSharpAssemblyVersionFile;
                              WriteSharedVBAssemblyVersionFile;
                              WriteSharedCPPCLIAssemblyVersionFile;
                              WriteSharedCPPAssemblyVersionFile;
                              WriteSharedWiXAssemblyVersionFile;
                              WriteSharedTextAssemblyVersionFile;"/>
    </Project>

J'ai deux questions à ce sujet:

  • Je suis encore à apprendre MSBuild. Si le nom de la cible est non spécifié ailleurs dans les objectifs, est la cible exécutée? Comment puis-je assurer que cet objectif est exécuté?
  • Les fichiers csproj censés déclarer un élément pour le Inclure endroit où BuildNumberFile est, même si elle n'existe pas tant que compiletime?
  • Do ItemGroups et inclure avoir un DependsOnTargets ou quelque chose qui leur permet font que le fichier existe avant de construire?
  • sont le contenu du fichier csproj utilisant ce supposé être enveloppé dans une cible qui exprime DependsOnTargets pour BuildNumberFile?

Merci!

Était-ce utile?

La solution

Je pense que j'ai pensé cela, mais deux personnes promu ma question donc je vais y répondre ici:

  • Vous pouvez vous assurer qu'une cible est géré par l'expression d'une dépendance à l'égard d'une autre cible. Microsoft.Common.targets expose deux cibles - BeforeBuild et AfterBuild - expressément dans le but d'être remplacée pour customizability. J'ai trouvé la meilleure façon de le faire était <Target Name="BeforeBuild" DependsOnTargets="WriteSharedCSharpAssemblyVersionFile" /> où WriteSharedCSharpAssemblyVersionFile est la cible déclarée dans le téléchargement à partir du lien dans le message original. En outre, si vous êtes nouveau MSBuild, cet objectif BeforeBuild doit être déclarée après les Microsoft.CSharp.targets est importé, mais les guides de modèle de csproj par défaut vous en faire.

  • La cible WriteSharedCSharpAssemblyVersionFile devrait en effet écrire le fichier vers un emplacement central, depuis lors de la construction d'une solution, toutes les cibles sont exécutées qu'une seule fois. Tous les projets doivent faire référence au fichier de cet endroit, même si elle n'existe pas, puisque la compilation de temps arrive (ou plus important encore, par les références de temps sont résolus), la cible BeforeBuild auront courir et le fichier sera en place.

    • Dans ma structure, j'ai ces fichiers versioning dans un dossier directement sous le dossier racine de la branche. En outre, étant donné que le fichier en cours de construction est généré, je l'ai construit dans le répertoire de sortie. Il semble un peu étrange d'être référencer les choses de la sortie, mais il préserve l'invariant d'avoir tous les produits de construction dans un seul endroit afin que le répertoire de sortie peut être soufflée comme un moyen d'effectuer un nettoyage.
  • Dans les éléments MSBuild constituent des entrées dans le système (généralement des fichiers) il est donc bizarre de penser à eux en fonction des objectifs. Après un apprentissage à cette question ne fait pas beaucoup de sens. Dans tous les cas, la réponse est non.

  • La totalité du contenu du fichier doit en effet pas être en une seule cible - tout ce qui est nécessaire est d'importer le fichier Wintellect.TFSBuildNumber.targets au début de votre fichier csproj, et déclarer la dépendance de BeforeBuild sur WriteSharedCSharpAssemblyVersionFile à la fin.

Hope this helps!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top