Budowanie paczki Nugetowej (przykład)

nuget logo

Buduję właśnie nugeta z solucji, która ma ponad 20 projektów. Ok 10 z nich ma wylądować w paczce. Reszta to Unit Testy i Functional Testy, których nie potrzebujemy. Paczka ta jest silnikiem obliczeniowym i będzie konsumowana przez większy system wewnątrz firmy. NuGet będzie hostowany tylko wewnętrznie.

Wygląda to tak:

  • Plik nuspec, w którym najważniejsze rzeczy to zdefiniowane id (unikalna nazwa NuGeta) oraz pattern jakie pliki wybrać, wygląda on prosto:
    <files>
     <file src="YourCompany.YourProject.*" target="lib\netstandard1.3" exclude="*.deps.json;*Tests*" />
    </files>
    
  • Ze skryptu PowerShellowego podaję odpowiednią versję w jakieś będzie paczka. Wersję pobieram z jednej DLLki (hardcoded)
  • Skrypt buduje solucję do folderu „BuildArtifacts”, pełne odpalanie wszystkich testów.
  • Przekazuję więc też gdzie szukać plików (powyższe „BuildArtifacts”).
  • NuGet zbudowany komendą:
    Write-Host "Building NuGet package" -ForegroundColor Green
    & nuget.exe pack "$code_dir\SolutionName.nuspec" -Version $nugetPackageVersion -Properties Debug -BasePath $build_artifacts_dir
    
  • Jeśli paczka w takiej samej wersji jest już na Serverze NuGetowym to skrypt ostrzega, ale nic nie podmienia. Nie chcemy przypadkiem nadpisać wersji, którą ktoś ściągnął. Jest wypisana sugestia, że może zapomnieliśmy podbić wersji.
  • Skrypt pyta czy wrzucić na Server NuGetowy (no dobra, na razie tylko folder share’owany), ale tylko jeśli jej tam nie ma, jak w punkcie powyżej.

Pliki, które lądują w paczce

Jeszcze w szczegółach chciałbym omówić, które pliki lądują w paczce a które nie i dlaczego.

<file src="YourCompany.YourProject.*" exclude="*.deps.json;*Tests*" />
  • „YourCompany.YourProject.*” – pozwala odfiltrować wszystkie dodatkowe biblioteki ściągnięte NuGetem.
  • „exclude=”*.deps.json;*Tests*” – odfiltrowuje DLLki naszych własnych testów, oraz pliki *deps.json powstałe podczas kompilacji.
  • chce mieć pliki *.pdb dołączone do paczki, więc ich nie filtruje. Dzięki temu osobom korzystający z paczki będzie łątwiej debugować kod, a większy rozmiar paczki nie jest aż tak istotny, bo to paczki NuGetowe i nie lądują w kontroli wersji.

Pełny kod skryptu

Task (korzystam z psake) który tworzy paczkę wygląda więc tak:

Task Create-And-Publish-Nuget -Depends Build {
    $libraryPath = Resolve-Path "$build_artifacts_dir\Jetbrains.Rider.dll"

    $assemblyVersion = get-assembly-version($libraryPath)

    $nugetPackageVersion = [string]$assemblyVersion.Major + "." + [string]$assemblyVersion.Minor + "." + [string]$assemblyVersion.Build
    
    Write-Host "Building NuGet package" -ForegroundColor Green
    & $nuget_exe_path pack "$code_dir\Rider.nuspec" -Version $nugetPackageVersion -Properties $build_configuration -BasePath $build_artifacts_dir

    $packageName = "Jetbrains.Rider." + $nugetPackageVersion + ".nupkg";
    
    $nugetServerDestinationPath = "$private_nuget_share\$packageName"

    $isAlreadyOnNugetServer = Test-Path $nugetServerDestinationPath

    if ($isAlreadyOnNugetServer ){
        Write-Host "Package in current version already exists on nuget server! Maybe you forgot to bump version?" -foregroundcolor "yellow"
    } else {
        while ($choice -notmatch "[y|n]"){
            $choice = read-host "Are you sure you want to update Jetbrains.Rider package on $private_nuget_share host? (Y/N)";
        }

        if ($choice -eq "y"){
            Copy-Item -Path "$packageName" -Destination $nugetServerDestinationPath
            Write-Host "New package is copied on server!" -foregroundcolor "green"
        }
    }    
}

function get-assembly-version() {
    param(
        [Parameter(Mandatory=$true)]
        [string] $file
    )
    
    $version = [System.Reflection.AssemblyName]::GetAssemblyName($file).Version;
    
    $version
}
Reklamy
Ten wpis został opublikowany w kategorii DevOps i oznaczony tagami , , , , . Dodaj zakładkę do bezpośredniego odnośnika.

5 odpowiedzi na „Budowanie paczki Nugetowej (przykład)

  1. Pingback: dotnetomaniak.pl

  2. 0xmarcin pisze:

    Dodam że jeśli chodzi o tworzenie plików nuspec to nie ma lepszego narzędzia niż Nuget Package Explorer (https://github.com/NuGetPackageExplorer/NuGetPackageExplorer).

  3. jryrych pisze:

    Do budowania paczek korzystam z https://marketplace.visualstudio.com/items?itemName=NuProjTeam.NuGetPackageProject i sprawdza się świetnie. Zawiera on szablon nuproj (analogiczny do csproja). w którym są zapisane ustawienia paczki. Największy plus tego dodatku jest taki, ze sam wykrywa zależności do paczki (na podstawie packages.config)

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Wyloguj / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Wyloguj / Zmień )

Zdjęcie na Facebooku

Komentujesz korzystając z konta Facebook. Wyloguj / Zmień )

Zdjęcie na Google+

Komentujesz korzystając z konta Google+. Wyloguj / Zmień )

Connecting to %s