Création et déploiement d’un package Nuget à l’aide de MSBuild

Dans ce billet je vais expliquer comment créer son propre package Nuget et son deploiement vers un serveur Nuget à l’aide de l’outil MSBuild.

Un peu de définition:

Nuget : c’est un outil développer par Microsoft qui permet la gestion et le déploiement de librairies tiers.

Package  Nuget : c’est une sorte de « zip » qui contient:

  • Les fichiers à déployer
  • Un fichier xml de manifeste qui sert de description au package

MSBuild : intégré à Visual Studio c’est lui qui permet la génération d’un projet. Son avantage c’est qu’il s’utilise avec un fichier xml de configuration.

L’idée:

Je vais donc:

  1. créer un fichier xml qui va etre utilisé par MSBUILD. Celui ci contient la définition des traitements à effectuéer par MSbuild pour récupérer la dll d’un projet Visual Studio « NugetCustom ».
  2. créer le package qui la contient: celui sera créer grace à l’outil « nuget.exe » et son fichier xml de manifeste sera mis à jour avec le numéro de version de l’assembly (de la dll).
  3. déposer ce package sur un serveur Nuget personel.

1- Pérequis

Dans mon projet « NugetCustom »  j’ai créé un répertoire « NugetScript » qui contient:

  • Nuget.exe : disponible ici
  • fichier xml de manifeste « NugetCustom.nuspec » :
<?xml version="1.0"?>
<package>
  <metadata>
    <id>NugetCustom</id>
    <version></version>
    <authors>Mikael K.</authors>
    <licenseUrl>http://yoururl.com</licenseUrl>
    <projectUrl>http://yoururl.com</projectUrl>
    <iconUrl>http://yoururl.com</iconUrl>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>Mon package Nuget.</description>
    <summary>Mon package Nuget.</summary>
    <language>fr-FR</language>
  </metadata>
</package>

Différentes balises sont donc à renseigner, la balise <version> sera remplie automatiquement en fonction de la version de l’assembly

2-Le fichier xml NugetCutom.proj utilisé par msbuild

Ici je parlerai uniquement des section propre à notre billet, pour plus détails sur ce fichier xml voir ici.

a- déclaration
<PropertyGroup>
    <TasksPath>D:\Builds\Builds\Tasks\</TasksPath>
  </PropertyGroup>

  <UsingTask TaskName="MSBuild.Community.Tasks.XmlUpdate"
AssemblyFile="$(TasksPath)MSBuild.Community.Tasks\MSBuild.Community.Tasks.dll" />

Dans cette section on déclare une « task » qui va permettre la modification du fichier xml de manifeste.

b- Création du package

 <Target Name="AfterDropBuild" >
    <Message Text="AfterDropBuild" Importance="high"></Message>
    <CreateProperty Value ="$(DropLocation)\$(BuildNumber)\%(ConfigurationToBuild.FlavorToBuild)\_PublishedWebsites">
      <Output TaskParameter ="Value" PropertyName ="ServerDeploySource"/>
    </CreateProperty>

    <CreateItem Include="$(DropLocation)\$(BuildNumber)\%(ConfigurationToBuild.FlavorToBuild)\_PublishedWebsites\NugetCustom\bin\*.dll">
      <Output TaskParameter="Include" ItemName="Lib" />
    </CreateItem>

    <!-- First copy the nuspec template files to the package dir -->
    <Copy SourceFiles="$(ServerDeploySource)\NugetCustom\NugetScript\NugetCustom.nuspec"
DestinationFolder="D:\Nuget\NugetCustom\" />

    <!-- Copy the source files to the package dir -->
    <Copy SourceFiles="@(Lib)"
DestinationFiles="@(Lib-&gt;'D:\NugetCustom\lib\NET40\%(RecursiveDir)%(Filename)%(Extension)')"
	SkipUnchangedFiles="true" OverwriteReadOnlyFiles="true"   />

    <!-- Get the version number of the main FV assembly to insert into the nuspec files -->
    <GetAssemblyIdentity
AssemblyFiles="$(DropLocation)\$(BuildNumber)\%(ConfigurationToBuild.FlavorToBuild)\_PublishedWebsites\NugetCustom\bin\NugetCustom.dll">
      <Output TaskParameter="Assemblies" ItemName="AsmInfo" />
    </GetAssemblyIdentity>

    <!-- insert the version number into the nuspec files -->
    <XmlUpdate
      Namespace="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd"
      XmlFileName="D:\NugetCustom\NugetCustom.nuspec"
      XPath="/package/metadata/version"
      Value="%(AsmInfo.Version)" />

    <Exec WorkingDirectory="D:\NugetCustom\Packages\" Timeout="120000"
          Command="D:\NugetCustom\NuGet.exe pack D:\NugetCustom\NugetCustom.nuspec" />

    <OnError ExecuteTargets="ErrorHandler" />
  </Target>

De la ligne 1 à la 18 , il s’agit de la copie des différents fichiers vers un répertoire temporaires de process.

De la ligne 19 à 31 , il s’agit de la modification du fichier xml de manifeste avec le numéro de version de l’assembly.

Ce numéro de version est important car c’est lui qui détermine si un package est un Update.

De la ligne 32 à 35 , on crée le package en utilisant nuget.exe.

c- Déploiement du package
  <Target Name="AfterDropBuild">
    <Copy SourceFiles="D:\NugetCustom\Packages\NugetCustom.%(AsmInfo.Version).nupkg"
	DestinationFiles="D:\NugetRepository\Packages\NugetCustom.%(AsmInfo.Version).nupkg"
	SkipUnchangedFiles="true" OverwriteReadOnlyFiles="true" />

  </Target>

C’est une simple copie de mon package vers le répertoire de mon serveur Nuget.

Pour le déploiement vers le serveur officiel Nuget, voir la documentation officiel elle est vraiment très bien faite

Ce fichier xml dans son intégralité se trouve ici

En savoir plus:

Un Très bon article sur developpez.com de Hinault Romaric : ici

nuget on codeplex: http://nuget.codeplex.com/

La documentation officiel: http://docs.nuget.org/


		

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s