2009-11-19 17 views
1

J'ai créé un fichier tfsbuild.proj qui crée une version finale de ma solution et dans lequel j'ai créé une cible personnalisée pour BuildNumberOverrideTarget qui gère les versions personnalisées. Je stocke le numéro de version dans un emplacement de fichier dans TFS et la tâche personnalisée obtiendra le numéro de version, vérifier les fichiers assemblyinfo.cs, modifier les détails de la version, archiver puis incrémenter le numéro de version pour la prochaine version. Tout fonctionnait bien, mais seulement si vous avez laissé TFS faire la toute première compilation avant d'ajouter les changements de version dans votre fichier tfsbuild.proj, c'est comme si cela dépendait de la structure du répertoire Sources \ construire. Donc, si vous décidez de ramifier votre source et exécuter une construction en l'état, il échouera avec une erreur bizarre comme:TFS build 2008 - BuildNumberOverrideTarget DependsOn ne s'exécute pas dans l'ordre correct pour la version initiale

Target "InitializeWorkspace" skipped. Previously built successfully. 
Target "BuildNumberOverrideTarget" in file "e:\tfstemp\TestProject\TestProject MainBranch Release\BuildType\TFSBuild.proj" from project "e:\tfstemp\TestProject\TestProject MainBranch Release\BuildType\TFSBuild.proj": 
Task "Message" 
    Loading last build number from file "e:\tfstemp\TestProject\TestProject MainBranch Release\BuildType\..\Sources\Version Number\buildnumber.txt" 
Done executing task "Message". 
Using "Exec" task from assembly "Microsoft.Build.Tasks.v3.5, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a". 
Task "Exec" 
    Command: 
    "C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\PrivateAssemblies\..\tf.exe" get /force /noprompt /overwrite buildnumber.txt 
e:\tfstemp\TestProject\TestProject MainBranch Release\BuildType\TFSBuild.proj(472,5): error MSB6003: The specified task executable "cmd.exe" could not be run. The directory name is invalid 
Done executing task "Exec" -- FAILED. 
Done building target "BuildNumberOverrideTarget" in project "TFSBuild.proj" -- FAILED. 
Done Building Project "e:\tfstemp\TestProject\TestProject MainBranch Release\BuildType\TFSBuild.proj" (EndToEndIteration target(s)) -- FAILED. 

Build FAILED. 

Après quelques recherches, je trouve le site Web suivant, qui indique que l'ordre n'est pas correct si vous vouloir remplacer la cible du numéro de build. Il suggère de respécifier l'ordre d'exécution ou d'ajouter le DependsOnTarget au BuildNumberOverrideTarget.

http://social.msdn.microsoft.com/forums/en-US/tfsbuild/thread/9103c92d-4b03-41d4-9eae-93c78cb6ea3a/

J'ai essayé les deux suggestions dans le poste, mais je ne arrive pas à le faire fonctionner, l'erreur de construction semble ignorer l'InitializeWorkspace.

J'ai mis en place une solution de contournement qui fonctionne partiellement, mais nous voyons alors des erreurs dans les zones branchées concernant un espace de travail inexistant. Notre solution était de rendre la structure de répertoire dans le BuildNumberOverrideTarget avec les modifications suivantes dans le fichier TFSBuild.proj:

<Target Name="BuildNumberOverrideTarget"> 
    <!-- Create a custom build number, matching the assembly version --> 
    <Message Text="Loading last build number from file &quot;$(MSBuildProjectDirectory)\..\Sources\Version Number\buildnumber.txt&quot;" /> 

    <!--need to ensure that the sources folder exists--> 
    <PropertyGroup> 
     <SourcesDirectory>$(MSBuildProjectDirectory)\..\Sources\Version Number</SourcesDirectory> 
    </PropertyGroup> 
    <MakeDir Directories="$(SourcesDirectory)"/> 

    <Exec Command="$(TF) get /force /noprompt /overwrite buildnumber.txt" 
      WorkingDirectory="$(MSBuildProjectDirectory)\..\Sources\Version Number\"> 
    </Exec> 

    <Exec Command="$(TF) checkout buildnumber.txt" 
     WorkingDirectory="$(MSBuildProjectDirectory)\..\Sources\Version Number\" IgnoreExitCode="true"> 
    </Exec> 
    ... rest omitted to keep short... 
</Target> 

Est-il possible que je peux forcer msbuild quand il court pour obtenir automatiquement toute la structure de la source avant de pour exécuter l'une de mes cibles personnalisées? Nous sommes en train de créer une version et je n'aime pas l'idée que c'est peut-être en train d'essayer de mettre en cache les anciennes versions des fichiers et des structures de dossiers.

Un grand merci,

Emma

Répondre

0

Je ne sais pas si cela fonctionne dans TFS 2008, mais je suis en mesure de résoudre ce problème dans TFS 2010 en définissant les dépendances suivantes:

<Target Name="BuildNumberOverrideTarget" DependsOnTargets="CoreInitializeWorkspace;CoreCleanAll;CoreGet"> 

Vous devez tous les 3 dépendances:

  • CoreInitializeWorkspace crée l'espace de travail juste, mais ne pas obtenir tous les fichiers
  • CoreGet obtient les fichiers, ce qui est ce que nous voulons
  • CoreCleanAll est pour nettoyer l'ancien code de construction précédente. Si nous ne dépendons pas, alors il fonctionnera après CoreGet et supprimer tout le code que nous venons de partir, alors la construction échouera car il n'a pas de code à compiler :-)