2009-02-12 14 views
20

J'utilise construit une tâche de pré-construction dans Visual Studio 2008 qui invoque msbuild:MSBuild pré-construction à jour AssemblyInfo non synchronisé avec les exe

C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe $(MSBuildProjectDirectory)\version.targets /p:Configuration=$(ConfigurationName) 

version.targets intérieur, je mets à jour le AssemblyInfo .cs fichier pour remplacer les informations de version:

<FileUpdate 
     Encoding="ASCII" 
     Files="$(MSBuildProjectDirectory)\Properties\AssemblyInfo.cs" 
     Regex="AssemblyInformationalVersion\(&quot;.*&quot;\)\]" 
     ReplacementText="AssemblyInformationalVersion(&quot;Product $(ConfigurationString) ($(buildDate))&quot;)]" 
    /> 

Lorsque je construis le projet via Visual studio 2008, il construit sans aucun problème. Mais quand je regarde les informations de version de l'exe qui en résulte, il contient l'horodatage précédent même si le AssemblyInfo.cs a été changé avec le "correct".

Il semblerait que les modifications de la pré-construction ne soient pas vues par la tâche de compilation principale et c'est toujours la dernière.

Des idées de ce que je fais mal?

+0

Je ne suis pas fou: http://social.msdn.microsoft .com/Forums/fr-FR/msbuild/thread/fe1d0b81-61f0-4224-8e38-feca158c9dc9/ –

Répondre

25

Je ne pense pas que vous fassiez quelque chose de mal - c'est un bug.

Je l'ai signalé here - vérifiez si vous pouvez le reproduire et ajouter une validation, nous pouvons peut-être le faire réparer par MS.

EDIT: J'ai essayé la suggestion de "Si" pour mettre à jour le fichier dans l'événement "BeforeBuild" - mais j'ai toujours le même mauvais résultat avec Visual Studio 2008/SP1.

MISE À JOUR/CONTOURNEMENT: MS a répondu au rapport de bogue. Pour contourner le problème, vous pouvez ajouter

<UseHostCompilerIfAvailable>FALSE</UseHostCompilerIfAvailable> 

à votre fichier csproj.

+0

+1 parce que nous utilisons très fortement le code généré automatiquement et après être passé de VS2005 à VS2008 (SP1) w Nous avons énormément souffert de ce bug (qui en réalité ne semble pas être un bug mais par conception ... un design médiocre!). Donc, votre réponse aide beaucoup. – mmmmmmmm

+0

+1 a résolu mon problème. Ne pas oublier de le mettre dans le haut . –

2

Intéressant, j'ai écrit ma propre tâche personnalisée qui est accrochée dans BeforeBuild et cela fonctionne très bien. Jamais eu un problème de VS ou MSBuild via la ligne de commande. Donc je dirais explorer BeforeBuild un peu plus ...

Je sais parce que nous utilisons notre build build (CruiseControl.NET) numéro de build comme la partie "Build" de la version, qui est intégrée dans tous les assemblages (nous partageons le même AssemblyInfo.cs pour AssemblyVersion et AssemblyFileVersion entre les assemblys dans la solution) et ceci est ensuite poussé (via la tâche FileUpdate) vers une variable dans notre projet WiX et également utilisé pour étiqueter le nom de fichier MSI.

<Target Name="BeforeBuild"> 
    <CallTarget Targets="UpdateAssemblyInfo" /> 
</Target> 

<Target Name="UpdateAssemblyInfo" Condition="'$(CIBuildNumber)' != ''"> 
    <UpdateVersion Attribute="AssemblyFileVersion" 
    AssemblyInfo=".\Properties\AssemblyInfo.cs" 
    BuildNumber="$(CIBuildNumber)" /> 
</Target> 

Si vous faites quelques vous googler devriez trouver d'autres exemples ... désolé, je ne peux pas vous donner le code Version mise à jour, je avais besoin la permission de mon travail, mais si vous ne pouvez pas trouver quoi que ce soit approprié sur le net, les tâches personnalisées sont faciles à écrire et ce qui précède devrait aider.

+0

Quelle version/SP de Visual Studio utilisez-vous? – laktak

+0

Nous avons démarré VS 2005 et .NET 2.0 et utilisons actuellement VS 2008 et .NET 3.5 (avec les derniers correctifs et SP) – si618

14

+1 pour le tour <UseHostCompilerIfAvailable>FALSE</UseHostCompilerIfAvailable>, bien que ni la solution retenue, ni l'article lié précisé que la ligne doit être ajoutée au premier élément<PropertyGroup> dans le fichier .csproj.

Il est également un problème avec Visual Studio seulement, comme l'invocation msbuild de la ligne de commande sur le même fichier .csproj (sans l'astuce) verra les fichiers de code générés compilés tout de suite (et non les versions précédentes) .

Aussi, je voudrais recommander que ce sujet soit étiqueté avec ce qui suit, que je devais creuser beaucoup pour trouver:

  1. VisualStudio
  2. compilateur
  3. BeforeBuild
  4. généré
  5. .NET
  6. C#
0

Utilisez quelque chose comme ci-dessous pour modifier le contenu de n'importe quel fichier. Ici je change la valeur de date de construction dans hallo.aspx quand chaque fois que je crée une construction.


par exemple. contenu Hallo.aspx

< date de construction> < 12 à 23,2011/date de construction>


<!-- regular expression to get value between html node: "[^<>]+(?=[<])" --> 
    <FileUpdate Files="$(AboutDir)Hallo.aspx" 
    Regex="Builddate[^&lt;&gt;]+(?=[&lt;])" ignoreCase="true" 
    ReplacementText="BuildDate: $(Day)-$(Month)-$(Year)" />