2009-01-13 6 views
10

J'ai configuré CruiseControl.net pour un tas de mes projets qui sont liés. Par conséquent, une seule balise de projet dans CruiseControl comporte plusieurs extractions SVN, puis un tas de tâches msbuild compilent tous les fichiers sln individuels.Versioning d'assemblage avec CruiseControl.net

J'ai besoin de mettre à jour la version d'ensemble de toutes les solutions lorsque cette construction est en cours. Cependant, comme je n'utilise pas nant et que je n'utilise pas les fichiers proj MSBuild, je ne suis pas sûr de savoir comment l'obtenir.

Je me demande s'il me manque quelque chose d'évident. J'ai juste besoin d'une solution qui peut être implémentée en faisant les changements appropriés dans le fichier ccnet.config sans que je doive apporter des changements aux fichiers csproj.

Merci, Anj

+1

Je suis confus. Que voulez-vous dire quand vous dites "ne pas utiliser les fichiers proj MSBuild"? Qu'est-ce qui est référencé par vos fichiers * .sln? (Les fichiers de projet créés par l'EDI, tels que * .csproj, ne sont que des fichiers de projet msbuild réguliers, que vous pouvez ouvrir et améliorer avec des tâches de construction et des cibles personnalisées.) –

Répondre

3

J'utilise Powershell pour cela. lpath est le chemin vers le code source, et buildnum est mon buildnumber que j'ajoute. C'est tout ce que je fais avec ça. Cependant, il devrait vous donner assez pour changer ou définir un ou tous les autres champs disponibles. Je passe dans lpath et j'obtiens le numéro de build à partir des variables d'environnement disponibles dans CC.NET et je peux utiliser ce script encore et encore, en changeant simplement ce que je passe sur la ligne de commande dans le fichier de configuration. J'en ai aussi un qui modifie les fichiers de ressources pour le code C++ si c'est réellement ce que vous avez besoin de modifier.

$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

J'ai trouvé cette regex plus performante (fonctionne avec plusieurs chiffres) '$ content = [Regex] :: Remplacer ($ content, '(assembly: AssemblyVersion \ (\" \ d + \. \ d + \. \ d +) \. \ d +', '$ 1.' + $ buildnum); ' – Myster

11

Qu'en est-il de l'utilisation d'un AssemblyInfo partagé dans vos projets?

C'est ce que nous faisons pour nos produits:

  • Chaque projet a ses propres AssemblyInfo.cs - il contient AssemblyTitle, AssemblyDescription, Guid, et d'autres attributs qui sont uniques à cette assemblée. Chaque projet contient également deux autres fichiers Assembly Info, notez qu'ils sont ajoutés sous la forme d'un lien plutôt que d'un fichier direct (VS -> Ajouter -> Fichier existant -> Ajouter comme lien (petite flèche vers le bas à côté de ajouter))

Les deux fichiers de lien:

  1. CompanyAssemblyInfo.cs - AssemblyCompany, AssemblyCopyright, AssemblyConfiguration, CLSCompliant, SecurityPermission, etc. en fait tout ce que nous voulons standard sur toutes nos assemblées.

  2. ProductAssemblyInfo.cs - AssemblyProduct, AssemblyVersion, AssemblyFileVersion. Cela nous permet de transmettre la même version à tous les assemblages du même fichier.

Notre processus CI et la libération est plus complexe, mais qui est au cœur de celui-ci - un seul point (fichier) qui contrôle la version du produit (ensembles, installateurs, tout!)

6

Il y a une tâche faire exactement ce que vous demandez.

Vous devez installer les tâches MSBuildCommunity, trouvées here.

Ensuite, vous pouvez créer quelque chose comme ceci:

<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> 

Notez que vous pouvez définir un préfixe de numéro de build dans votre fichier ccnet.config afin que vos ensembles seront numérotés 2.1.0.x où x est le numéro de build. C'est comme ça que nous faisons notre numérotation des versions là où je travaille.

Vous devez toujours conserver un fichier AssemblyInfo.cs par défaut dans le cadre de chacun des projets qui composent votre solution.

+0

De la question, il semblait qu'il ne voulait pas s'appuyer sur msbuild pour cela –

+1

Oui, je ne suis pas d'accord avec cette approche - vous voulez vraiment que votre fichier de configuration CCNet fasse aussi peu que possible, et mettre le courage de le processus de construction dans un fichier MSBuild MSBuild a beaucoup plus de fonctionnalités pour des choses comme les versions d'assemblage.C'est pourquoi CCNet transmet implicitement la valeur $ (CCNetLabel) sur MSBuild. –