2009-01-13 13 views
10

He configurado CruiseControl.net para muchos de mis proyectos relacionados. Como resultado, una etiqueta de proyecto único en CruiseControl tiene múltiples comprobaciones de SVN y luego un conjunto de tareas de msbuild compilan todos los archivos sln individuales.Versiones de ensamblaje usando CruiseControl.net

Necesito actualizar la versión de ensamblaje de todas las soluciones cuando se realiza esta compilación. Sin embargo, dado que no estoy usando nant y no estoy usando archivos MSBuild proj, no estoy seguro de cómo obtener esto.

Me pregunto si me falta algo obvio. Solo necesito una solución que se pueda implementar haciendo los cambios apropiados en el archivo ccnet.config sin requerir que haga cambios a los archivos csproj.

Gracias, Anj

+1

Estoy confundido. ¿A qué te refieres cuando dices "no usar archivos MSBuild proj"? ¿A qué hacen referencia sus archivos * .sln? (Los archivos de proyecto creados por IDE, como los archivos * .csproj, son simplemente archivos de proyecto de msbuild regulares, que puede abrir y mejorar con tareas de compilación y objetivos personalizados). –

Respuesta

3

que utilizan PowerShell para esto. lpath es la ruta al código fuente, y buildnum es mi buildnumber que añado. Eso es todo lo que realmente hago con esto. Sin embargo, debería darle suficiente para cambiar o establecer uno o todos los otros campos disponibles. Paso en lpath y obtengo el buildnumber de las variables de entorno disponibles en CC.NET y puedo usar este script una y otra vez, simplemente cambiando lo que paso en la línea de comando en el archivo de configuración. También tengo uno que modifica los archivos de recursos para el Código C++ si eso es realmente lo que necesita modificar.

$files = Get-ChildItem $lpath -recurse -filter *AssemblyInfo.cs -name 

Foreach ($file in $files) 
{ 
    $file = $lpath + "\" + $file 

    $fileObject=get-item $file 

    $fileObject.Set_IsReadOnly($False) 

    $sr = new-object System.IO.StreamReader($file, [System.Text.Encoding]::GetEncoding("utf-8")) 
    $content = $sr.ReadToEnd() 
    $sr.Close() 

    $content = [Regex]::Replace($content, '(?<=\[assembly: AssemblyVersion\("[0-9].[0-9].[0-9].)[0-9]?[0-9]?[0-9]', $buildnum); 
    $content = [Regex]::Replace($content, '(?<=\[assembly: AssemblyFileVersion\("[0-9].[0-9].[0-9].)[0-9]?[0-9]?[0-9]', $buildnum); 

    $sw = new-object System.IO.StreamWriter($file, $false, [System.Text.Encoding]::GetEncoding("utf-8")) 
    $sw.Write($content) 
    $sw.Close() 

    $fileObject.Set_IsReadOnly($True) 
} 
+0

Encontré que esta expresión regular funciona mejor (funciona con múltiples dígitos) '$ content = [Regex] :: Replace ($ content, '(assembly: AssemblyVersion \ (\" \ d + \. \ d + \. \ d +) \. \ d +', '$ 1.' + $ buildnum); ' – Myster

11

¿Qué hay de usar un AssemblyInfo compartido en todos sus proyectos?

Esto es lo que hacemos por nuestros productos:

  • Cada proyecto tiene su propio AssemblyInfo.cs - contiene AssemblyTitle, AssemblyDescription, Guid, y otros atributos que son exclusivos de esa asamblea.

  • Cada proyecto también tiene otros dos archivos de información de ensamblaje, tenga en cuenta que estos se agregan como un enlace en lugar de un archivo directo (VS -> Agregar -> Archivo existente -> Agregar como enlace (pequeña flecha hacia abajo al lado))

Los dos archivos de enlace:

  1. CompanyAssemblyInfo.cs - AssemblyCompany, AssemblyCopyright, AssemblyConfiguration, CLSCompliant, SecurityPermission, etc. Básicamente todo lo que queremos estándar en todos nuestros montajes.

  2. ProductAssemblyInfo.cs - AssemblyProduct, AssemblyVersion, AssemblyFileVersion. Esto nos permite enviar la misma versión a todos los ensamblajes desde un archivo.

Nuestro proceso de CI y la liberación es más complicado, pero que está en el corazón de la misma - un único punto (archivo) que controla la versión del producto (asambleas, instaladores, todo!)

6

Hay una tarea para hacer exactamente lo que estás preguntando.

Tendrá que instalar las tareas de MSBuildCommunity, encontró here.

A continuación, puede crear algo como esto:

<PropertyGroup> 
<MyAssemblyVersion>$(CCNetLabel)</MyAssemblyVersion> 
</PropertyGroup> 

<Target Name="GenAssemblyInfo"> 
    <AssemblyInfo 
     ContinueOnError="false" 
     CodeLanguage="CS" 
     OutputFile="$(MSBuildProjectDirectory)\YourAssembly\AssemblyInfo.cs" 
     AssemblyTitle="blah" 
     AssemblyDescription="blah blah" 
     AssemblyCompany="Anj Software, Inc." 
     AssemblyProduct="Anj's Awesome App" 
     AssemblyCopyright="blah blah" 
     CLSCompliant="false" 
     AssemblyVersion="$(MyAssemblyVersion)" 
     AssemblyFileVersion="$(MyAssemblyVersion)" 
    /> 
</Target> 

Tenga en cuenta que se puede establecer un número de prefijo de construcción en su archivo ccnet.config para que sus asambleas serán numeradas 2.1.0.x donde x es el número de compilación. Así es como hacemos nuestra numeración de versiones donde trabajo.

Aún necesitará mantener un archivo AssemblyInfo.cs por defecto como parte de cada uno de los proyectos que componen su solución.

+0

De la pregunta, sonaba como si no quisiera confiar en msbuild para esto. –

+1

Sí, estaría en desacuerdo con ese enfoque; realmente desea que su archivo de configuración CCNet haga lo mínimo posible, y ponga las agallas de el proceso de compilación en un archivo MSBuild. MSBuild tiene mucha más funcionalidad para cosas como las versiones de ensamblaje. Es por eso que CCNet pasa el valor de $ (CCNetLabel) a MSBuild implícitamente. –

Cuestiones relacionadas