2009-01-13 14 views
10

Mam konfigurację CruiseControl.net na kilka moich projektów, które są powiązane. W rezultacie pojedynczy tag projektu w CruiseControl ma wiele kas SVN, a następnie kilka zadań msbuild kompiluje wszystkie indywidualne pliki sln.Wersje montażowe z użyciem CruiseControl.net

Muszę zaktualizować wersję zestawu wszystkich rozwiązań, gdy kompilacja jest wykonywana. Jednak, ponieważ nie używam nant i nie korzystam z plików proj MSBuild, nie jestem pewien, jak to uzyskać.

Zastanawiam się, czy brakuje mi czegoś oczywistego. Potrzebuję tylko rozwiązania, które można zaimplementować, wprowadzając odpowiednie zmiany w pliku ccnet.config bez konieczności wprowadzania zmian w plikach csproj.

Dzięki Anj

+1

Jestem zdezorientowany. Co masz na myśli, mówiąc "nie korzystasz z plików MSBuild proj"? Do czego odwołują się twoje pliki * .sln? (Pliki projektu tworzone przez IDE, takie jak pliki * .csproj, są zwykłymi plikami projektu msbuild, które można otwierać i ulepszać za pomocą niestandardowych zadań i celów budowania.) –

Odpowiedz

3

Używam PowerShell do tego. lpath jest ścieżką do kodu źródłowego, a buildnum jest moim numerem kompilacji, który dołączam. To wszystko, co faktycznie robię z tym. Powinien jednak dać ci wystarczająco dużo, aby zmienić lub ustawić dowolne inne dostępne pola. Przechodzę na ścieżkę lpath i dostaję numer kompilacji z dostępnych zmiennych środowiskowych w CC.NET i mogę używać tego skryptu w kółko, po prostu zmieniając to, co przekazuję w wierszu poleceń w pliku konfiguracyjnym. Mam również taki, który modyfikuje pliki zasobów dla kodu C++, jeśli jest to faktycznie to, co trzeba zmodyfikować.

$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

Znalazłem, że to wyrażenie działa lepiej (działa z wieloma cyframi) '$ content = [Regex] :: Replace ($ content, '(assembly: AssemblyVersion \ (\" \ d + \. \ d + \. \ d +) \. \ d +', '$ 1.' + $ buildnum); ' – Myster

11

Co z wykorzystaniem udostępnionej AssemblyInfo w swoich projektach?

To co robimy dla naszych produktów:

  • Każdy projekt ma własne AssemblyInfo.cs - ten zawiera AssemblyTitle, AssemblyDescription, GUID i inne atrybuty, które są unikalne dla tego zespołu.

  • Każdy projekt ma również dwa inne pliki Informacje o złożeniu, należy pamiętać, że są one dodawane jako łącze, a nie bezpośredni plik (VS -> Dodaj -> Istniejący plik -> Dodaj jako łącze (mała strzałka w dół obok dodania))

Oba pliki Link:

  1. CompanyAssemblyInfo.cs - AssemblyCompany, AssemblyCopyright, AssemblyConfiguration, CLSCompliant, SecurityPermission, itd. W zasadzie wszystko, co chcemy standardem we wszystkich naszych zespołów.

  2. ProductAssemblyInfo.cs - AssemblyProduct, AssemblyVersion, AssemblyFileVersion. Dzięki temu możemy przekazać tę samą wersję do wszystkich złożeń z jednego pliku.

Nasz proces CI i wydanie jest bardziej skomplikowany, ale to na sercu to - jednym punktem (plik), który kontroluje wersję produktu (zespoły, instalatorzy, wszystko!)

6

Jest to zadanie zrobić to, o co pytasz.

Musisz zainstalować zadania MSBuildCommunity, znalezione here.

Następnie można stworzyć coś takiego:

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

pamiętać, że można ustawić numer kompilacji prefiksu w pliku ccnet.config tak, że zespoły będą numerowane 2.1.0.x gdzie x jest numer kompilacji. Tak robimy numerację wersji, w której pracuję.

Nadal będziesz musiał zachować domyślny plik AssemblyInfo.cs jako część każdego projektu, który tworzy twoje rozwiązanie.

+0

Od pytania, brzmiało to tak, jakby nie chciał polegać na msbuild na ten temat –

+1

Tak, nie zgodziłbym się z tym podejściem - naprawdę chcesz, aby twój plik konfiguracyjny CCNet robił tak mało, jak to tylko możliwe, i proces budowania do pliku MSBuild, MSBuild ma znacznie więcej funkcjonalności dla takich rzeczy, jak wersje zespołów, dlatego CCNet przekazuje wartość $ (CCNetLabel) bezpośrednio do MSBuild. –

Powiązane problemy