Tengo una solución con múltiples proyectos. Estoy tratando de optimizar los archivos AssemblyInfo.cs mediante la vinculación de un archivo de información de ensamblaje de toda la solución. ¿Cuáles son las mejores prácticas para hacer esto? ¿Qué atributos deben estar en el archivo de la solución y cuáles son específicos del proyecto/ensamblaje?
Editar: si está interesado, hay una pregunta de seguimiento ¿Cuáles son las diferencias entre AssemblyVersion, AssemblyFileVersion y AssemblyInformationalVersion?
Estamos usando un archivo global llamado GlobalAssemblyInfo.cs y uno local llamado AssemblyInfo.cs. El archivo global contiene los siguientes atributos:
[Assembly: AssemblyProduct("Your Product Name")]
[Assembly: AssemblyCompany("Your Company")]
[Assembly: AssemblyCopyright("Copyright © 2008 ...")]
[Assembly: AssemblyTrademark("Your Trademark - if applicable")]
#if DEBUG
[Assembly: AssemblyConfiguration("Debug")]
#else
[Assembly: AssemblyConfiguration("Release")]
#endif
[Assembly: AssemblyVersion("This is set by build process")]
[Assembly: AssemblyFileVersion("This is set by build process")]
El AssemblyInfo.cs local contiene los siguientes atributos:
[Assembly: AssemblyTitle("Your Assembly title")]
[Assembly: AssemblyDescription("Your Assembly description")]
[Assembly: AssemblyCulture("The culture - if not neutral")]
[Assembly: ComVisible(true/false)]
// unique id per Assembly
[Assembly: Guid("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx")]
Puede agregar GlobalAssemblyInfo.cs mediante el siguiente procedimiento:
En mi caso, estamos construyendo un producto para el que tenemos una solución de Visual Studio, con varios componentes en sus propios proyectos. Los atributos comunes van. En la solución, hay alrededor de 35 proyectos y una información de ensamblaje común (CommonAssemblyInfo.cs), que tiene los siguientes atributos:
[Assembly: AssemblyCompany("Company")]
[Assembly: AssemblyProduct("Product Name")]
[Assembly: AssemblyCopyright("Copyright © 2007 Company")]
[Assembly: AssemblyTrademark("Company")]
//This shows up as Product Version in Windows Explorer
//We make this the same for all files in a particular product version. And increment it globally for all projects.
//We then use this as the Product Version in installers as well (for example built using Wix).
[Assembly: AssemblyInformationalVersion("0.9.2.0")]
Los otros atributos, como AssemblyTitle, AssemblyVersion, etc., los suministramos por asamblea. Al crear un ensamblaje, tanto AssemblyInfo.cs como CommonAssemblyInfo.cs están integrados en cada ensamblaje. Esto nos brinda lo mejor de ambos mundos en los que es posible que desee tener algunos atributos comunes para todos los proyectos y valores específicos para otros.
Espero que ayude.
La solución presentada por @JRoppert es casi la misma que la que yo hago. La única diferencia es que coloco las siguientes líneas en el archivo local AssemblyInfo.cs, ya que pueden variar con cada ensamblaje:
#if DEBUG
[Assembly: AssemblyConfiguration("Debug")]
#else
[Assembly: AssemblyConfiguration("Release")]
#endif
[Assembly: AssemblyVersion("This is set by build process")]
[Assembly: AssemblyFileVersion("This is set by build process")]
[Assembly: CLSCompliant(true)]
También (generalmente) uso una información de ensamblaje común por solución, asumiendo que una solución es una línea de producto única/producto liberable. El archivo de información de ensamblaje común también tiene:
[Assembly: AssemblyInformationalVersion("0.9.2.0")]
Lo que establecerá el valor "ProductVersion" mostrado por el Explorador de Windows.
Tareas de la comunidad de MSBuild contiene una tarea personalizada llamada AssemblyInfo que puede usar para generar su assemblyinfo.cs. Requiere un poco de edición manual de sus archivos csproj para usar, pero vale la pena.
En mi opinión, usar un GlobalAssemblyInfo.cs es más problemático de lo que vale, porque necesita modificar cada archivo de proyecto y recordar modificar cada nuevo proyecto, mientras que obtiene un AssemblyInfo.cs de manera predeterminada.
Para los cambios en los valores globales (es decir, la empresa, el producto, etc.), los cambios generalmente son tan poco frecuentes y fáciles de gestionar que no creo que SECO deba ser una consideración. Simplemente ejecute el siguiente script de MSBuild (dependiente de MSBuild Extension Pack ) cuando desee cambiar manualmente los valores en todos los proyectos como una sola vez:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="UpdateAssemblyInfo" xmlns="http://schemas.Microsoft.com/developer/msbuild/2003">
<ItemGroup>
<AllAssemblyInfoFiles Include="..\**\AssemblyInfo.cs" />
</ItemGroup>
<Import Project="MSBuild.ExtensionPack.tasks" />
<Target Name="UpdateAssemblyInfo">
<Message Text="%(AllAssemblyInfoFiles.FullPath)" />
<MSBuild.ExtensionPack.Framework.AssemblyInfo
AssemblyInfoFiles="@(AllAssemblyInfoFiles)"
AssemblyCompany="Company"
AssemblyProduct="Product"
AssemblyCopyright="Copyright"
... etc ...
/>
</Target>
</Project>
Para compartir un archivo entre varios proyectos, puede agregar un archivo existente como un enlace.
Para hacer esto, agregue un archivo existente y haga clic en "Agregar como enlace" en el selector de archivos.
(fuente: free.fr )
En cuanto a qué poner en el archivo compartido, sugeriría colocar cosas que se compartirían entre los ensamblajes. Cosas como derechos de autor, compañía, quizás versión.
Una cosa que he encontrado útil es generar los elementos AssemblyVersion (etc.) aplicando la sustitución de token en la fase previa a la compilación.
Yo uso TortoiseSvn, y es fácil usar su SubWCRev.exe
para convertir una plantilla AssemblyInfo.wcrev
en AssemblyInfo.cs
. La línea relevante en la plantilla podría verse algo como esto:
[Assembly: AssemblyVersion("2.3.$WCREV$.$WCMODS?1:0$$WCUNVER?1:0$")]
El tercer elemento es entonces el número de revisión. Utilizo el cuarto elemento para comprobar que no he olvidado cometer ningún archivo nuevo o modificado (el cuarto elemento es 00 si todo está bien).
Por cierto, agregue AssemblyInfo.wcrev
a su control de versión y ignore AssemblyInfo.cs
si usa esto.
No se recomienda usar un solo archivo AseemblyInfo.cs para varios proyectos. El archivo de Información de la Asamblea incluye información que podría ser relevante solo para esa Asamblea específica. Las dos piezas de información más obvias son AssemblyTitle
y AssemblyVersion
.
Una solución mejor podría ser usar el archivo targets
, que maneja MSBuild, para "inyectar" atributos de ensamblado a más de un proyecto.