Establecer el número de versión for.NET Proyectos básicos-CSPROJ-no proyectos JSON


Esta pregunta es muy similar a Establecer el número de versión para los proyectos.NET Core, pero no es la misma. Usando la última versión estable de.NET Core en el momento de escribir (1.1) y VS2017,. NET Core ha cambiado de archivos de proyecto basados en JSON a archivos CSPROJ.

Entonces, lo que estoy tratando de hacer es configurar un entorno de CI donde me gustaría poder modificar algo antes de una compilación para sellar mis compilaciones con el número de versión correcto.

Si utilizo el atributos como este el viejo (SharedAssemblyInfo.cs trick):

[assembly: AssemblyFileVersion("3.3.3.3")]
[assembly: AssemblyVersion("4.4.4.4")]

En algún lugar del proyecto, obtengo
CS0579 - Duplicate 'System.Reflection.AssemblyFileVersionAttribute'
y
CS0579 - Duplicate 'System.Reflection.AssemblyVersionAttribute'
errores al construir.

Al indagar un poco en él, encuentro que hay un archivo que se parece a este generado durante el proceso de compilación (no existe antes de que compile) en \obj\Debug\netcoreapp1.1:

//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by a tool.
//     Runtime Version:4.0.30319.42000
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

using System;
using System.Reflection;

[assembly: System.Reflection.AssemblyCompanyAttribute("TestApplication")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyDescriptionAttribute("Package Description")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.99.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.99")]
[assembly: System.Reflection.AssemblyProductAttribute("TestApplication")]
[assembly: System.Reflection.AssemblyTitleAttribute("TestApplication")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.1.99.0")]

// Generated by the MSBuild WriteCodeFragment class.

Pregunta - ¿Cómo hago esta parte?
Así que puedo ver que esto debe ser generado de alguna manera a partir de los valores introducidos en el proyecto propiedades 'página del paquete', pero no se cual sería la forma correcta de cambiar estos valores en mi máquina CI.

Idealmente, me gustaría poder especificar toda esta información en mi script CI (Jenkins), pero me conformaría con solo poder establecer el número de versión.

EDITAR-Más información
Después de leer la primera respuesta, quería dejar claro que estoy creando servicios y paquetes NuGet , y preferiría tener 1 forma de versionar todo, que sería como el viejo proyecto JSON donde podría actualizar un solo archivo.

UPDATE Voy con el scripting de un cambio en el archivo CSPROJ que en mi opinión es bastante hacky como la sección que necesito modificar se ve así...

<PropertyGroup>
 <OutputType>Exe</OutputType>
 <TargetFramework>netcoreapp1.1</TargetFramework>
 <Version>1.0.7777.0</Version>
 <AssemblyVersion>1.0.8888.0</AssemblyVersion>
 <FileVersion>1.0.9999.0</FileVersion>
 <Company>MyCompany</Company>
 <Authors>AuthorName</Authors>
 <Product>ProductName</Product>
 <Description />
 <Copyright>Copyright © 2017</Copyright>
</PropertyGroup>

Entonces - el problema aquí es que hay múltiples elementos de 'PropertyGroup'; los otros parecen estar etiquetados - pero sin saber cómo se junta el CSPROJ, no puedo decir que esto siempre será el caso.

Estoy trabajando en la premisa de que los detalles del paquete siempre se completarán, de lo contrario las etiquetas de valor (arriba) no aparecen en el XML, por lo que puedo usar un script para actualizar los valores en su lugar. Si las etiquetas de valor no estuvieran allí, no tendría una idea clara en qué elemento PropertyGroup insertar los valores (y también en qué orden, ya que esto parece ser importante; cambiar el orden me impidió cargar el proyecto en VS2017).

Todavía estoy esperando una solución mejor que esta uno!

Actualización: Después de que alguien marque esta pregunta como un posible duplicado ( Control automático de versiones en Visual Studio 2017 (. NET Core)) - No había visto esta pregunta antes y ahora leerla parece ser casi lo mismo, excepto que no solo quiero establecer el número de versión. Además, las respuestas a esta pregunta no resuelven mi problema - solo pregunta lo que hice en mi pregunta. La respuesta aceptada a mi pregunta es exactamente la respuesta que necesito para resolver mi problema, así que mientras el otro la pregunta vino primero y parece la misma - no me ayuda en absoluto. Tal vez un mod puede ayudar?

Author: Community, 0000-00-00

8 answers

Puede anular cualquier propiedad de la línea de comandos pasando /p:PropertyName=Value como argumentos a dotnet restore, dotnet build y dotnet pack.

Actualmente, la composición de la versión funciona de la siguiente manera: Si Version no está configurado, use VersionPrefix (el valor predeterminado es 1.0.0 si no está configurado) y - si está presente - anexe VersionSuffix.

Todas las demás versiones son entonces predeterminadas a lo que sea Version.

Así que, por ejemplo, puede establecer <VersionPrefix>1.2.3</VersionPrefix> en su csproj y luego llamar a dotnet pack --version-suffix beta1 para producir un YourApp.1.2.3-beta1.nupkg (si tiene referencia de proyecto que desea la versión sufijo para ser aplicado también, es necesario llamar dotnet restore /p:VersionSuffix=beta1 antes de eso - este es un error conocido en las herramientas).

Por supuesto, también puede usar variables personalizadas, vea este problema de GitHub para ver algunos ejemplos.

Para una referencia completa de los atributos de ensamblado soportados, sugiero mirar el código fuente de la lógica de compilación aquí (los valores rodeados por $() son las propiedades utilizadas). Y como ya estoy hablando de la fuente, esto es la lógica que compone la versión y algunas otras propiedades.

 37
Author: Martin Ullrich,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-04 08:17:36
dotnet build /p:AssemblyVersion=1.2.3.4

¿Funciona eso para ti?

 14
Author: Chris McKenzie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-31 22:35:11

Para responder directamente a su pregunta: El nuevo SDK para msbuild está generando automáticamente un archivo de información de ensamblaje. Puede suprimir esto usando directivas msbuild (para ver el ejemplo it by: invoke dotnet migrate en un proyecto.proyecto basado en json).

Pero déjame decirte mi manejo: tuve varios proyectos compartiendo la misma versión. Agregué un archivo version.props que contenía un grupo de propiedades que incluía un elemento llamado VersionPrefix. Este archivo lo incluí a través de la instrucción csproj file (Include). También eliminé todos los archivos AssemblyInfo.cs y deja que el SDK los genere para mí.

Modifico el archivo version.props durante la compilación.

 6
Author: Thomas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-08 13:17:58

Uso Jenkins + Octopus para CI, y lo siguiente funcionó bastante bien:

  1. Tiene un script pre-build Powershell que puede tomar CI build number como param o default a algo preestablecido.
  2. Tiene un archivo nuspec separado en el proyecto para CI.
  3. El script previo a la compilación actualizaría el archivo nuspec con la última versión de compilación.
  4. Publicar proyecto con Jenkins.
  5. Llama a Nuget manualmente con un archivo nuspec desde #2.
  6. Empuje el paquete nuget a Pulpo.
 3
Author: Ignas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-07 13:38:11

MSBuild 2017 generará alguna información del ensamblado si no la encuentra en el archivo de proyecto.

Si puede leer el archivo de destino de msbuild, puede mirar:

[VS Install Dir] \MSBuild\Sdks\Microsoft.NET.Sdk\build\Microsoft.NET.GenerateAssemblyInfo.targets

Verá que puede usar alguna propiedad en su archivo de proyecto para deshabilitar la información de ensamblaje generada para evitar que se duplique con sus herramientas generadas.

  • <GenerateAssemblyInfo> (Esta propiedad activará / desactivará todos los ensamblados generados info)
  • <GenerateAssemblyCompanyAttribute>
  • <GenerateAssemblyConfigurationAttribute>
  • <GenerateAssemblyCopyrightAttribute>
  • <GenerateAssemblyDescriptionAttribute>
  • <GenerateAssemblyFileVersionAttribute>
  • <GenerateAssemblyInformationalVersionAttribute>
  • <GenerateAssemblyProductAttribute>
  • <GenerateAssemblyTitleAttribute>
  • <GenerateAssemblyVersionAttribute>
  • <GenerateNeutralResourcesLanguageAttribute>
 3
Author: Anh Phan Tuan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-19 08:44:42

Como he respondido aquí, he creado una herramienta CLI llamada dotnet-setversion que puede usar para el control de versiones *.csproj-style.NET Core projects (en inglés).

Durante una compilación de CI, puede usar GitVersion u otra herramienta para determinar un número de versión para su proyecto y luego invocar dotnet-setversion $YOUR_VERSION_STRING en el directorio raíz de su proyecto.

 0
Author: Tagc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:54:47

Pasar /p: propertyName = Value como argumentos no funciona para mí (ASP.Net Core 2.0 Web App). Encontré las tareas de Compilación de Versiones de Manifiesto en marketpace: https://marketplace.visualstudio.com/items?itemName=richardfennellBM.BM-VSTS-Versioning-Task

 0
Author: Michael Giger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-22 12:09:13

En mi caso, la clave principal era /property:Version=1.2.3.4. Y la siguiente línea de comandos hizo el trabajo:

dotnet build SolutionName.sln -c Release /property:Version=1.2.3.4

Esto anulará la versión predeterminada del ensamblado.

 0
Author: maytham-ɯɐɥʇʎɐɯ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-15 00:36:27