Vítejte na blog.vyvojar.cz Přihlásit | Registrovat | Pomoc

Vytvoření a publikace NuGet balíčku při buildu

Jednoduché řešení automatizace vytváření NuGet balíčků při buildu aplikace s použitím msbuild a nuget.exe bez dalších komponent. Znalci základů úpoužívání a vytváření NuGet balíčků mohou přeskočit až na krok 3. Předpokládám dále základní znalosti msbuild syntaxe.

Používáme to kvůli automatickým buildům, ale funguje to i z Visual Studia, nemělo by to být závislé na použitém build serveru

Krok 1: Příprava solution

Pro solution nastavíme “Enable NuGet Package Restore”, třeba podle originálního návodu. To přidá k solution adresář .nuget, kde se nachází nuget.exe, který budeme používat dál. Nadále budu předpokládat, že projekt má vlastní podadresář v rámci solution. Pokud tomu tak není, je potřeba upravit cestu k nuget.exe.

Krok 2: Příprava projektu

V adresáři s projektovým souborem spustíme příkaz “..\.nuget\nuget spec”. Tento příkaz vytvoří nuspec soubor, tento soubor vložíme do projektu s nastavením Build Action: None, případně soubor doplníme a upravíme. Ponecháme makro $version$, které zajistí vytvoření verze podle AssemblyVersion výsledné knihovny.

Krok 3: Úprava build procesu

Nejprve si otevřeme projektový soubor pro editaci (tady je návod jak) a doplníme AfterBuild target který vytvoří a vypublikuje balíček na server s pomocí příkazové řádky.

<Target Name="AfterBuild" Condition="'$(IsDesktopBuild)'=='false'">

  <PropertyGroup>
    <!-- NuGet BUG? - trailing slash in BasePath causes exception, so remove it -->
    <NugetBasePath Condition="!HasTrailingSlash($(TargetDir))">$(TargetDir)</NugetBasePath>
    <NugetBasePath Condition="HasTrailingSlash($(TargetDir))">$(TargetDir).</NugetBasePath>
    <!-- nuget exe path (relative to project directory) -->
    <NugetExe Condition="'$(NugetExe)'==''">$(MSBuildProjectDirectory)\..\.nuget\nuget.exe</NugetExe>
  </PropertyGroup>

  <!-- Copy files for nuget (nuget hack, because nuget needs \bin\Release folder with dll) -->
  <MakeDir Directories="$(MSBuildProjectDirectory)\$(OutputPath)" Condition="!Exists('$(MSBuildProjectDirectory)\$(OutputPath)')" />
  <Copy SourceFiles="@(IntermediateAssembly)" DestinationFolder="$(MSBuildProjectDirectory)\$(OutputPath)" SkipUnchangedFiles="true" />

  <!-- Delete existing packages -->
  <Delete Files="$(TargetDir)$(ProjectName).*.nupkg" />
  <Exec Command="&quot;$(NugetExe)&quot; pack &quot;$(MSBuildProjectFullPath)&quot; -BasePath &quot;$(NugetBasePath)&quot;"
        WorkingDirectory="$(TargetDir)" ContinueOnError="true" IgnoreExitCode="true" />
  <!-- Create item NugetPackageFile -->
  <CreateItem Include="$(TargetDir)$(ProjectName).*.nupkg">
    <Output ItemName="NugetPackageFile" TaskParameter="Include" />
  </CreateItem>

  <!-- push nuget package to server -->
  <Exec Command="&quot;$(NugetExe)&quot; push &quot;@(NugetPackageFile)&quot; -s http://repo.myserver.cz/nuget/ 00000000-0000-0000-0000-000000000000"
        Condition=" @(NugetPackageFile) != '' " />
</Target>

Celé se to spouští pouze při buildu na serveru (minule jsem psal jak detekovat TFS build server). Při vyřazení podmínky to bude balíček vytvářet a publikovat při každém buildu i z Visual Studia.

Poznámka na závěr

Pro automatické vytvoření NuGet balíčku při buildu aplikace existuje pro Team Foundation Server 2012 doplněk NuGetter který zajistí při použití build serveru vytvoření balíčku i jeho publikaci na NuGet server s komfortním nastavením. Ale mě nevyhovuje třeba proto, že stále ještě používáme TFS2010.

Zveřejněno 19. července 2013 15:07 by arci
Vedeno pod: , ,

Komentář

Žádné komentáře
Neregistrovaní uživatele nemužou přidávat komentáře.
 
Vyvojar.cz na prodej!