2009-01-13 14 views
10

Ich habe CruiseControl.net für ein paar meiner Projekte eingerichtet, die verwandt sind. Als Ergebnis hat ein einzelnes Projekt-Tag in CruiseControl mehrere SVN-Checkouts und dann eine Reihe von Msbuild-Aufgaben, die alle einzelnen SLN-Dateien kompilieren.Assembly Versioning mit CruiseControl.net

Ich muss die Assembly-Version aller Lösungen aktualisieren, wenn dieser Build durchgeführt wird. Da ich jedoch nicht nant benutze und keine MSBuild proj-Dateien verwende, bin ich unsicher, wie ich das bekommen soll.

Ich frage mich, ob ich etwas offensichtlich vermisse. Ich brauche nur eine Lösung, die durch entsprechende Änderungen in der Datei ccnet.config implementiert werden kann, ohne dass ich Änderungen an csproj-Dateien vornehmen muss.

Danke, Anj

+1

Ich bin verwirrt. Was meinst du, wenn du sagst "keine MSBuild Proj-Dateien verwenden"? Auf was wird mit Ihren * .sln-Dateien verwiesen? (Projektdateien, die von der IDE erstellt wurden, wie * .csproj-Dateien, sind nur reguläre msbuild-Projektdateien, die Sie mit benutzerdefinierten Build-Aufgaben und -Zielen öffnen und erweitern können.) –

Antwort

3

Ich benutze Powershell für diese. lpath ist der Pfad zum Quellcode und buildnum ist meine Buildnummer, die ich angehängt habe. Das ist alles was ich damit mache. Es sollte Ihnen jedoch genug geben, um einige oder alle anderen verfügbaren Felder zu ändern oder festzulegen. Ich übergebe lpath und erhalte die Buildnummer aus den verfügbaren Umgebungsvariablen in CC.NET und ich kann dieses Skript immer wieder verwenden, indem ich einfach das ändere, was ich in der Kommandozeile in der Konfigurationsdatei übergebe. Ich habe auch eine, die die Ressourcendateien für den C++ Code ändert, wenn das tatsächlich das ist, was Sie ändern müssen.

$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

Ich fand, dass diese Regex besser funktioniert (funktioniert mit mehreren Ziffern) '$ content = [Regex] :: Ersetzen ($ content, '(assembly: AssemblyVersion \ (\" \ d + \. \ d + \. \ d +) \. \ d +', '$ 1.' + $ buildnum); ' – Myster

11

Wie wäre es mit einer gemeinsamen AssemblyInfo in Ihren Projekten?

Dies ist, was wir für unsere Produkte tun:

  • Jedes Projekt hat seine eigene AssemblyInfo.cs ist - diese enthält Assembly, Assembly, Guid und andere Attribute, die zu dieser Versammlung einzigartig sind.

  • Jedes Projekt hat auch zwei andere Assembly Info Dateien, beachten Sie, dass diese als Link und nicht als direkte Datei hinzugefügt werden (VS -> Hinzufügen -> Vorhandene Datei -> Als Link hinzufügen (kleiner Pfeil neben Hinzufügen)

    )

Die beiden Link-Dateien:

  1. CompanyAssemblyInfo.cs - AssemblyCompany, AssemblyCopyright, AssemblyConfiguration, CLSCompliant, Security usw. Im Grunde alles, was wir auf allen unseren Versammlungen Standard wollen.

  2. ProductAssemblyInfo.cs - AssemblyProduct, AssemblyVersion, AssemblyFileVersion. Dies ermöglicht es uns, die gleiche Version für alle Assemblies aus der einen Datei zu übernehmen.

Unsere CI und Freigabeprozess ist komplizierter, aber das ist im Herzen des es - ein einziger Punkt (Datei), die die Produktversion steuert (Baugruppen, Installateure, alles!)

6

Es ist eine Aufgabe, genau das zu tun, wonach du fragst.

Sie müssen die MSBuildCommunity-Aufgaben installieren, gefunden here.

Dann können Sie so etwas wie dies erstellen:

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

Beachten Sie, dass Sie eine Build-Nummer Präfix in Ihrer ccnet.config Datei festlegen können, so dass Ihre Baugruppen werden 2.1.0.x zu nummerieren, wobei x die Build-Nummer. So machen wir unsere Versionsnummerierung wo ich arbeite.

Sie müssen weiterhin eine Standarddatei AssemblyInfo.cs als Teil der einzelnen Projekte speichern, aus denen Ihre Lösung besteht.

+0

Aus der Frage klang es so, als ob er sich nicht auf msbuild verlassen würde .. –

+1

Ja, ich würde diesem Ansatz nicht zustimmen - du willst wirklich deine CCNet Konfigurationsdatei so wenig wie möglich machen und den Mut aufbringen Der Build-Prozess in eine MSBuild-Datei MSBuild bietet viel mehr Funktionen für Assembly-Versionen, daher übergibt CCNet den $ (CCNetLabel) -Wert implizit an MSBuild. –