msbuild - descargar - nuget 3.6 visual studio 2015
¿Existe un enfoque recomendado para configurar un paquete NuGet dirigido a múltiples marcos en TeamCity utilizando MSBuild? (2)
He leído un puñado de publicaciones (consulte las referencias a continuación) y todavía tengo que encontrar una guía sobre las mejores prácticas que sea específica para mi pila de tecnología.
El objetivo: crear un único paquete NuGet dirigido a múltiples marcos .NET creados a partir de un único archivo .csproj a través de TeamCity utilizando MSBuild y NuGet.
Las limitaciones:
- Tire el código del VCS solo una vez.
- Todos los ensamblados compilados deben tener la misma versión.
- .Csproj único (no uno por marco de destino).
Tengo dos enfoques en mente:
Crear una configuración de construcción única. Contendría tres pasos de compilación: compilar .NET 3.5, compilar .NET 4.0, empacar con NuGet. Cada paso de compilación dependería del éxito del último. El único problema real que veo con este enfoque (y espero que haya una solución que no conozco) es que cada paso de compilación requeriría su propio conjunto de parámetros de compilación (por ejemplo, system.TargetFrameworkVersion y system.OutputPath) para designar el ubicación única para que se asiente la DLL (p. ej., bin / release / v3.5 y bin / release / v4.0) para que el paso del paquete NuGet pueda hacer su trabajo basándose en la sección Archivos en el archivo .nuspec.
Crear múltiples configuraciones de compilación. Una configuración de compilación según los pasos de compilación descritos anteriormente. Con este enfoque, es fácil resolver el problema de los parámetros de compilación TargetFrameworkVersion y OutputPath, pero ahora tengo que crear dependencias de instantáneas y compartir el número de versión de ensamblaje entre las compilaciones. También consume espacios de configuración de compilación, lo cual está bien (pero no es óptimo) para nosotros ya que tenemos una licencia Enterprise.
Opción # 1 parece ser la opción obvia. Opciones # 2 se siente sucia.
Así que mis dos preguntas son:
- ¿Es posible crear parámetros que son únicos para un paso de compilación?
- ¿Hay un tercer enfoque mejor?
Referencias:
- Construcción de NuGet multi-marco con símbolos para la gestión interna de dependencias
- Nuget: empaquetar una solución con múltiples proyectos (enfocándose en múltiples marcos)
- http://lostechies.com/joshuaflanagan/2011/06/23/tips-for-building-nuget-packages/
- http://msdn.microsoft.com/en-us/library/hh264223.aspx
- https://stackoverflow.com/a/1083362/607701
- http://confluence.jetbrains.com/display/TCD7/Configuring+Build+Parameters
- http://docs.nuget.org/docs/creating-packages/creating-and-publishing-a-package
Aquí está mi solución preferida (Opción # 1):
La magia se basa en una solución desafortunada. Si está dispuesto a hacer este compromiso, esta solución funciona. Si no lo está, puede seguir el problema que abrí en el rastreador de problemas de JetBrains .
La configuración de construcción única se ve así:
Anote el nombre de los dos primeros pasos de compilación. De hecho, se denominan explícitamente como los valores TargetFrameworkVersion para .NET 3.5 y 4.0, respectivamente.
Luego, en la sección Parámetros de compilación, he configurado los siguientes parámetros:
Y finalmente, el paso del paquete Nuget realiza la traducción de la ruta del archivo de acuerdo con la sección de archivos de mi .nuspec:
<files>
<file src="bin/release/v3.5/*.*" target="lib/net35" />
<file src="bin/release/v4.0/*.*" target="lib/net40" />
</files>
Aquí hay una solución tomando el segundo enfoque:
El proyecto contiene las siguientes configuraciones de compilación y plantilla:
El Generador de números de compilación compartido es la primera compilación de la cadena. No hace nada más que crear un número de compilación que las compilaciones dependientes compartirán. Estoy usando el número de compilación compartida del complemento de TeamCity por Nicholas Williams.
Y aquí están las configuraciones notables en la plantilla de compilación:
Tenga en cuenta que el número de compilación proviene de la ID de compilación del Generador de números de compilación compartido mencionado anteriormente. Entonces, en mi caso, el ID de esa compilación es 14. También tenga en cuenta la variable% TargetFrameworkVersion% en la ruta del artefacto. Afortunadamente, TeamCity admite la interpolación variable en casi todas partes.
Para que la plantilla aproveche el número de compilación, debe tener una dependencia de instantáneas en esa configuración de compilación:
Y, finalmente (con respecto a la plantilla), los parámetros de construcción son casi idénticos a los parámetros en mi solución preferida. Tenga en cuenta el parámetro de configuración adicional, sin embargo. Esto es lo que las configuraciones de compilación heredadas anularán:
Luego, en las compilaciones dependientes, debe conectar una dependencia de instantáneas para que el número de compilación (heredado de la plantilla) realmente funcione tomando también una dependencia en la configuración de compilación del número de compilación compartida:
Y, por supuesto, necesita establecer el marco objetivo real:
Con las compilaciones reales configuradas, ahora puede configurar la configuración de compilación del paquete NuGet. No es necesario adjuntar a una raíz VCS:
Pero sí necesita configurar un grupo de dependencias (tanto de instantáneas como de artefactos):
Y, finalmente, ya has terminado.