He pasado la mayor parte de algunas horas tratando de encontrar una manera de incrementar automáticamente las versiones en un .NETCoreApp 1.1 (Visual Studio 2017).
Sé que AssemblyInfo.cs se está creando dinámicamente en la carpeta: obj/Debug/netcoreapp1.1/
No acepta el antiguo método de:
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.*")]
Si configuro el proyecto en un paquete, puedo configurar las versiones allí, pero parece que esto se usa para construir el archivo AssemblyInfo.cs.
Mi pregunta es, ¿alguien ha descubierto cómo controlar la versión en proyectos .NET Core (o .NETStandard para el caso)?
/p:
bandera adotnet msbuild
en su script de compilación y configurar la versión, la empresa, los derechos de autor ... todas esas cosas buenas.<Deterministic>False</Deterministic>
en el csproj para usarlo. (o use cualquier otra lógica de MSbuild para calcular<VersionPrefix>
/<Version>
)Respuestas:
He estado buscando un incrementador de versión para una aplicación Net Core en VS2017 usando el formato de configuración csproj.
Encontré un proyecto llamado dotnet bump que funcionó para el formato project.json pero luché por encontrar una solución para el formato .csproj. El escritor de dotnet bump en realidad ideó la solución para el formato .csproj y se llama MSBump.
Hay un proyecto en GitHub para ello en:
https://github.com/BalassaMarton/MSBump
donde puede ver el código y también está disponible en Nuget. Simplemente busque MSBump en Nuget.
fuente
Agregar
<Deterministic>False</Deterministic>
dentro de una<PropertyGroup>
sección de .csprojLa solución para hacer que AssemblyVersion * funcione se describe en "Mensaje de error confuso para el comodín en [AssemblyVersion] en .Net Core # 22660"
Las razones por las que los desarrolladores de .Net Core consideran beneficiosas las compilaciones deterministas se describen en http://blog.paranoidcoding.com/2016/04/05/deterministic-builds-in-roslyn.html y los compiladores deben ser deterministas: las mismas entradas generan las mismas salidas # 372
Sin embargo, si está utilizando TeamCity, TFS u otra herramienta CI / CD, probablemente sea mejor mantener el número de versión controlado e incrementado por ellos y pasar a compilar como parámetro (como se sugirió en otras respuestas), por ejemplo
Número de paquete para paquetes NuGet
fuente
Si está utilizando Visual Studio Team Services / TFS o algún otro proceso de compilación de CI para tener control de versiones integrado, puede utilizar el
Condition
atributo de msbuild , por ejemplo:Esto le indicará al compilador de .NET Core que use lo que sea que esté en la
BUILD_BUILDNUMBER
variable de entorno si está presente, o un respaldo0.0.1-local
si está haciendo una compilación en su máquina local.fuente
Se me ocurrió una solución que funcionó casi igual que el antiguo atributo AssemblyVersion con estrella (*) - AssemblyVersion ("1.0. ") *
Los valores para AssemblyVersion y AssemblyFileVersion están en el archivo .csproj del proyecto MSBuild (no en AssemblyInfo.cs ) como propiedad FileVersion (genera AssemblyFileVersionAttribute ) y AssemblyVersion (genera AssemblyVersionAttribute ). En el proceso de MSBuild utilizamos nuestra tarea personalizada de MSBuild para generar números de versión y luego anulamos los valores de estas propiedades FileVersion y AssemblyVersion con nuevos valores de la tarea.
Entonces, primero creamos nuestra tarea personalizada de MSBuild GetCurrentBuildVersion :
Hereda la clase de tarea desde Microsoft.Build.Utilities.Task clase de Microsoft.Build.Utilities.Core paquete NuGet. Toma la propiedad BaseVersion (opcional) en la entrada y devuelve la versión generada en la propiedad de salida Versión. La lógica para obtener los números de versión es la misma que la del control de versiones automático de .NET (el número de compilación es el recuento de días desde el 1/1/2000 y la revisión es medio segundo desde la medianoche).
Para construir esta tarea de MSBuild, usamos el tipo de proyecto de biblioteca de clases .NET Standard 1.3 con esta clase.
El archivo .csproj puede tener este aspecto:
Este proyecto de tarea también está disponible en mi GitHub holajan / DC.Build.Tasks
Ahora configuramos MSBuild para usar esta tarea y establecemos las propiedades FileVersion y AssemblyVersion . En el archivo .csproj se ve así:
Cosas importantes aquí:
La ventaja de esta solución es que funciona no solo a partir de compilaciones en el servidor de compilación, sino también en compilaciones manuales de dotnet build o Visual Studio.
fuente
DateTime.UtcNow
lugar de unDateTime.Now
métodoGetCurrentBuildVersionString()
en particular si el código se ejecuta en máquinas de compilación automatizadas. Pueden funcionar a las 2 a. M. O a las 3 a. M. De la mañana cuando su computadora cambia a / desde el horario de verano. EnDateTime.Now
ese escenario, es posible que esté retrocediendo en términos de versión. Es cierto que este es un caso de esquina y también admito que soy exigente. :-) Además, el problema también desaparece si configura la misma zona horaria en todas las máquinas de compilación y no se ajusta al horario de verano.Puede usar una función de propiedad de MSBuild para establecer el sufijo de la versión según la fecha actual:
Esto generará un paquete con un nombre como: PackageName.1.0.0-pre20180807-1711.nupkg .
Más detalles sobre las funciones de propiedad de MSBuild: https://docs.microsoft.com/en-us/visualstudio/msbuild/property-functions
Se
Version
forma a partir de la combinación deVersionPrefix
yVersionSuffix
, o siVersionSuffix
está en blanco,VersionPrefix
únicamente.fuente
Acepté la respuesta anterior porque @Gigi es correcta (a partir de ahora) pero estaba molesto y se me ocurrieron los siguientes scripts de PowerShell.
Primero tengo el script en mi carpeta de solución (UpdateBuildVersion.ps1):
Agregué esto al archivo csproj:
Incluso a pesar de que está configurado para ser un PreBuildEvent, el hecho es que los números de versión no se actualizan hasta DESPUÉS de que el archivo se haya cargado en la memoria, por lo que el número de versión no se reflejará hasta la próxima compilación. De hecho, podría cambiarlo a PostBuildEvent y tendría el mismo efecto.
También creé los siguientes dos scripts: (UpdateMinorVersion.ps1)
(UpdateMajorVersion.ps1)
fuente
dotnet build /p:AssemblyVersion=1.2.3.4
Estaba respondiendo a: "¿alguien ha descubierto cómo controlar la versión en proyectos .NET Core (o .NETStandard para el caso)?" Encontré esta pregunta tratando de resolver este problema en el contexto de una compilación de CI. Quería establecer la versión de ensamblaje en el número de compilación de CI.
fuente
Estos valores ahora se establecen en el
.csproj
archivo:Estos son los mismos valores que ve si va a la pestaña Paquete en la configuración del proyecto. Si bien no creo que pueda usar
*
para aumentar automáticamente la versión, lo que puede hacer es introducir un paso de posprocesamiento que reemplace las versiones por usted (por ejemplo, como parte de su integración continua).fuente
Hice una herramienta CLI simple para configurar cadenas de versión .csproj .NET Core aquí . Puede combinarlo con herramientas como GitVersion para el cambio automático de versiones durante las compilaciones de CI, si eso es lo que busca.
fuente
Para habilitar el control de versiones de su .Net Core / .Net Cualquier proyecto basado en su configuración de GIT, use las etiquetas / describe la funcionalidad de GIT.
He estado usando un archivo Prebuild.targets.xml que se encuentra en la carpeta raíz del proyecto y se incluye en el archivo csproj como:
Utilice la etiqueta "GenerateAssembyInfo" para deshabilitar la generación automática de información de ensamblaje.
Luego, Prebuild.targets.xml generará un archivo CommonAssemblyInfo.cs donde puede incluir las etiquetas de versión que desee según su versión de GIT
NOTA: He encontrado Prebuilds.targets.xml en otro lugar, así que no me he molestado en limpiarlo).
El archivo Prebuild.targets.xml:
EDITAR: Si está construyendo usando MSBUILD el
Podría causarle problemas, use
en lugar
fuente
Puede hacer lo siguiente, dentro del archivo csproj. No descubrí las matemáticas. Encontré eso en otro lugar de stackoverflow. Pero esto funciona y le dará algo similar a 1.0. * Para la versión.
fuente
La extensión de Versiones automáticas para Visual Studio ahora admite el autoincremento .Net Core y .Net Standard en una interfaz de usuario simple.
https://marketplace.visualstudio.com/items?itemName=PrecisionInfinity.AutomaticVersions
fuente
Gracias a @joelsand por señalarme en la dirección correcta.
Tuve que cambiar su respuesta ligeramente, ya que cuando se ejecutó DevOps Build, obtuve la siguiente excepción
Tuve que agregar $ (BUILD_BUILDNUMBER) al final de la sección major.minor.build. Para eliminar la duplicación de la versión real, también utilizo un prefijo de versión:
fuente
Podemos usar un parámetro especial para
dotnet publish -- version-suffix 1.2.3
Para la versión del archivo:
Para la versión:
https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-publish?tabs=netcore21
fuente
Creo que esta respuesta de @joelsand es la respuesta correcta para configurar el número de versión para dotnet core que se ejecuta en VSTS
Para agregar más información para esta respuesta,
BUILD_BUILDNUMBER
es en realidad una variable predefinida .Resulta que hay 2 versiones de variable predefinida.
Uno es build.xxxx, el otro es BUILD_XXXX.
Solo puede usar
Environment Variable Name
en cproj.fuente
build.xxxx
usa en el front-end para hacer referencia dentro de una tubería yBUILD_XXXX
es el mismo valor pero con una sintaxis ligeramente modificada requerida para hacer referencia a la variable en PS?