2009-02-12 17 views
20

estoy usando una tarea previa a la compilación en Visual Studio 2008 que invoca msbuild:Pre-construir tarea de MSBuild para actualizar AssemblyInfo no en sincronía con exe construido

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

version.targets dentro, estoy actualizando el AssemblyInfo Cs archivo para reemplazar la información de versión:

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

Cuando construyo el proyecto a través de Visual Studio 2008, se construye sin ningún problema.

Pero cuando miro la información de la versión del exe resultante, contiene la marca de tiempo anterior aunque AssemblyInfo.cs ha sido cambiado con el "correcto".

Parece que los cambios de precompilación no son vistos por la tarea de compilación principal y siempre están atrasados.

¿Alguna idea de lo que estoy haciendo mal?

+0

No estoy loco: http://social.msdn.microsoft .com/Foros/es-ES/msbuild/thread/fe1d0b81-61f0-4224-8e38-feca158c9dc9/ –

Respuesta

25

No creo que estés haciendo nada mal, es un error.

Lo he informado here - compruebe si puede reproducirlo y agregar una validación, quizás podamos solucionarlo con MS.

EDIT: Comprobé la sugerencia de "Si" para actualizar el archivo en el evento "BeforeBuild"; sin embargo, sigo teniendo el mismo resultado incorrecto con Visual Studio 2008/SP1.

ACTUALIZACIÓN/SOLUCIÓN Ocasional: MS ha respondido al informe de error. Como solución, puede agregar

<UseHostCompilerIfAvailable>FALSE</UseHostCompilerIfAvailable> 

a su archivo csproj.

+0

+1 porque usamos código generado automáticamente y después de cambiar de VS2005 a VS2008 (SP1) w He sufrido mucho por este error (que en realidad no parece ser un error, sino por diseño ... ¡mal diseño!). Entonces tu respuesta ayuda mucho. – mmmmmmmm

+0

+1 resolvió mi problema. No te olvides de ponerlo en la parte superior . –

2

Interesante, escribí mi propia tarea personalizada que está enganchada a BeforeBuild y está funcionando bien. Nunca tuve un problema de VS o MSBuild a través de la línea de comandos. Así que yo diría explorar BeforeBuild un poco más ...

Lo sé porque utilizamos nuestro número de compilación del servidor de compilación (CruiseControl.NET) como la parte de "compilación" de la versión, que está integrada en todos los ensamblajes (compartimos el mismo AssemblyInfo.cs para AssemblyVersion y AssemblyFileVersion en los ensamblados de la solución) y esto luego se empuja (a través de la tarea FileUpdate) a una variable en nuestro proyecto WiX y también se utiliza para etiquetar el nombre del archivo MSI.

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

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

Si usted hace algo de googlear que debe encontrar otros ejemplos ... lo siento, no puedo dar el código UpdateVersion, necesitaría el permiso de mi trabajo, pero si no puedo encontrar nada adecuado en las tareas netas y personalizadas son fáciles de escribir y lo anterior debería ayudar.

+0

¿Qué versión/SP de Visual Studio estás usando? – laktak

+0

Comenzamos en VS 2005 y .NET 2.0 y ahora estamos usando VS 2008 y .NET 3.5 (con las últimas revisiones y SP) – si618

14

1 para la <UseHostCompilerIfAvailable>FALSE</UseHostCompilerIfAvailable> truco, aunque ni la solución aceptada ni el artículo enlazado especificaron que la línea debe ser añadido a la primer elemento<PropertyGroup> en el archivo.csproj.

También es un problema sólo con Visual Studio, como invocando msbuild desde la línea de comandos en el mismo .csproj archivo (sin el truco) verá los archivos generados código compilado de inmediato (y no las versiones anteriores) .

Además, me gustaría recomendar que este tema se etiqueta con la siguiente, ya que tuve que cavar mucho para encontrarlo:

  1. VisualStudio
  2. compilador
  3. BeforeBuild
  4. generada
  5. .NET
  6. C#
0

Use algo como lo siguiente para cambiar cualquier contenido para cualquier archivo. Aquí estoy cambiando el valor de la fecha de compilación en hallo.aspx cada vez que creo una compilación.


e.g. contenido Hallo.aspx

< builddate> 12-23,2011 </builddate>


<!-- 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)" /> 

Cuestiones relacionadas