2012-09-17 17 views
12

Tengo un archivo por lotes simple que ejecuto desde una línea de comandos de DOS que se utiliza para crear una aplicación C# pequeña que publica un proyecto ClickOnce. Una línea es la siguiente:Especifique la versión de publicación con la línea de comandos de MSBuild como versión de ensamblaje del proyecto

msbuild MyApp.csproj /t:publish /property:PublishDir="deploy/" 

Esta publica actualmente la aplicación, sino que utiliza la versión de publicación que he creado en la pestaña "Publicar" de Visual Studio. Espero poder establecer la versión de publicación en la línea de comandos, y específicamente, me gustaría usar la Asamblea Versión del proyecto. Algo así como:

msbuild MyApp.csproj /t:publish /property:PublishDir="deploy/" /property:PublishVersion="$(Proj.AssemblyVersion)" 

estoy esperando hacer sin crear una tarea personalizada, ya que esto es sólo una solución provisional, y voy a sustituirlo por un sistema de construcción más adecuado después.

Alternativamente, He mirado en la actualización de la versión publicada manifiesta mediante el Mage Command Line Tool con la bandera -Update, pero no sabía cómo encontrar el número de versión del ensamblado del proyecto o montaje construido sin utilizar PowerShell o algún programa que necesita ser descargado Si pudiera usar algo que viene con Visual Studio, eso funcionaría también.

+0

¿la respuesta a [esta cuestión] (http://stackoverflow.com/questions/1859328/setting-assemblyfileversion-with-msbuild-call) ayuda en absoluto? – adrianbanks

+0

@adrianbanks: eso establece la versión del ensamblaje a partir de alguna variable en el script por lotes. Espero establecer la versión de implementación desde la versión de ensamblaje (donde la versión de ensamblaje se almacena en AssemblyInfo.cs para el proyecto). –

Respuesta

10

Intente agregar esto a su archivo .csproj. El objetivo será recuperar la versión del ensamblado de salida y actualizar el ApplicationVersion antes de la publicación:

<Target Name="BeforePublish"> 
    <GetAssemblyIdentity AssemblyFiles="$(TargetPath)"> 
    <Output TaskParameter="Assemblies" ItemName="fooAssemblyInfo"/> 
    </GetAssemblyIdentity> 
    <PropertyGroup> 
    <ApplicationVersion>%(fooAssemblyInfo.Version)</ApplicationVersion> 
    </PropertyGroup> 
</Target> 

Probablemente hay una manera más agradable para obtener dinámicamente el nombre de ensamblado, pero para su propósito que debe hacer el truco.

crédito a esta respuesta para la sintaxis GetAssemblyIdentity: https://stackoverflow.com/a/443364/266882

Interlocutor Editar:

Véase el comentario a continuación para su actualización.

+0

Eventualmente fui con otra solución (cambiando las reglas un poco), pero parece que funcionaría si mi camino no funciona. ¡Gracias! –

+0

Volví a esto, y no funcionó exactamente como esperaba. Mi esperanza era tener la versión de implementación definida en el manifiesto de despliegue que se genera. Sin embargo, esto se genera antes de publicar.Hacer un paso similar como se muestra en BeforeBuld funcionaría, pero el ensamblado no está disponible para entonces. Mi solución es pasar la versión a msbuild en la línea de comandos y usar eso en la tarea BeforeBuild. –

+1

bin \ $ (Configuración) \ WpfApplication1.exe podría reemplazarse por $ (TargetPath) –

8
msbuild xxx.csproj /target:clean;publish /property:ApplicationVersion=1.2.3.4 
+0

Si usa VSTS, puede usar '/property:ApplicationVersion=1.0.0. $ (Build.SourceVersion)' para obtener el ID del conjunto de cambios/confirmación anexado automáticamente. Por supuesto, todavía puedes hacer versiones importantes aquí si lo deseas, pero significa que una compilación nueva siempre tendrá una nueva versión y siempre podrás rastrear la versión original. –

+0

Eso se siente increíble, durante los últimos 7 años he estado autoincrementándolo yo mismo –

9

Con el fin de actualizar correctamente la versión declarada en el manifiesto de implementación es necesario modificar la ApplicationVersion en el "AfterCompile" paso más que el paso de "BeforePublish", ya que el manifiesto de aplicación se genera en tiempo de compilación. Pero no puede confiar en la propiedad $ (TargetPath) para apuntar al ensamblado y en su lugar usar la siguiente ruta: $ (ProjectDir) obj \ $ (ConfigurationName) \ $ (TargetFileName)

Así que aquí está la actualización código de destino fragmento que se puede añadir al archivo .csproj:

<Target Name="AfterCompile"> 
    <GetAssemblyIdentity AssemblyFiles="$(ProjectDir)obj\$(ConfigurationName)\$(TargetFileName)"> 
    <Output TaskParameter="Assemblies" ItemName="AssemblyInfo" /> 
    </GetAssemblyIdentity> 
    <PropertyGroup> 
    <ApplicationVersion>%(AssemblyInfo.Version)</ApplicationVersion> 
    </PropertyGroup> 
</Target> 
Cuestiones relacionadas