web-dev-qa-db-fra.com

Automatisation de la création du package NuGet dans le cadre du processus de construction

J'ai un processus de construction automatisé que je souhaiterais développer pour pouvoir créer les bibliothèques que je distribue via NuGet. L'exécution de nuget.exe pour créer les packages est une opération manuelle.

Quel est le meilleur moyen de configurer VS 2010 pour que mon fichier de package NuGet (* .nupkg) soit le résultat final d'une construction "Release"?

N'oubliez pas que j'ai d'autres fichiers (contenu et outils) pour certains des packages. Et, dans la plupart des cas, plusieurs projets ont été fusionnés dans un seul package NuGet afin de prendre en charge .NET 4, Silveright et Phone 7.

(Je dois préciser que le processus "automatisé" existant est un simple programme d'exécution de fichiers de traitement par lots qui construit une solution à l'aide de la ligne de commande.)

METTRE À JOUR

Je veux actualiser cette discussion car le problème n'a pas été résolu. Bien que le lien fourni par @pravin soit utile, il ne résout pas le fait que j'ai plusieurs projets dans un même package, ainsi que d'autres contenus tels que les scripts PowerShell, les transformations de configuration et de code source, etc.

Le meilleur exemple que je puisse utiliser est un assemblage comportant à la fois une version .NET 4 et Silverlight 5. Ceux-ci sont distribués dans le même paquet. Je ne peux pas utiliser un événement post-build pour créer le package car celui-ci dépend de deux projets.

63
SonOfPirate

Une chose qui pourrait bien fonctionner est de créer un fichier .proj MSBuild personnalisé. Vous pouvez définir un couple de cibles dans le script personnalisé, le premier à exécuter la compilation sur votre solution. Une deuxième cible à exécuter après la compilation utiliserait la tâche EXEC MSBuild pour appeler l'utilitaire de ligne de commande nuget.exe. Ensuite, vous mettez à jour votre exécuteur de fichier de commandes pour exécuter l'exécutable msbuild fournissant votre fichier de projet personnalisé en tant qu'argument. Vous utilisez peut-être déjà MSBuild dans votre script de traitement par lots, auquel cas il s'agirait simplement d'une permutation d'arguments. Vous pouvez inclure votre fichier de projet personnalisé dans les éléments de solution de votre solution. Si vous le faisiez, vous pourriez facilement ajouter une référence à un outil externe dans Visual Studio pour tester rapidement votre script personnalisé afin de vous assurer qu'il était en train de générer et de produire le package comme vous le souhaitez.

Exemple de MSBuild

Vous pouvez l'utiliser comme point de départ:

<Project DefaultTargets="Compile" xmlns="http://schemas.Microsoft.com/developer/msbuild/2003" >
    <PropertyGroup>
      <SolutionFile></SolutionFile>
      <NugetExecutable>C:\PathToNuget\nuget.exe</NugetExecutable>
      <NuspecFile></NuspecFile>
    </PropertyGroup>

    <Target Name = "Compile">
        <MSBuild Projects="$(SolutionFile)" Properties="Configuration=Release" />
    </Target>

    <Target Name = "Package">
    <!-- You could use the MSBuild Copy task here to move the compiled code into
           a structure that fits your desired package format -->
      <Exec Command="&quot;$(NugetExecutable)&quot; pack $(NuspecFile)" />
    </Target>
</Project>

Vous appelleriez alors ceci comme:

"C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe" Build.proj /p:SolutionFile=PathToSolution\App.sln;NuspecFile=foo.nuspec
32
Josh Rack

Je fais ce que vous voulez réaliser dans mon projet actuel:

Chaque assemblage est construit dans son propre paquet de pépites, avec des dépendances en place.

Je l'ai résolu en créant un dossier de paquet dans le projet pour lequel je voulais créer un paquet de nugets. Là je configure un fichier nuspec avec les informations nécessaires sur le nupkg

J'y crée tous les dossiers et les fichiers non modifiables nécessaires à la structure du package Nuget.

J'ai ajouté une étape de post-build dans le projet qui copie les fichiers qui viennent d'être générés dans le dossier du paquet et exécute nuget.exe

Donc ça va:

  • Projet de construction. 
  • Copier la sortie dans le paquet\Lib du projet.
  • Exécutez nuget.exe avec le fichier nuspec dans le dossier du package.
  • Copier le résultat dans le dossier de sortie à côté du reste de la sortie.

Nuget.exe doit être soit dans un dossier fixe sur votre système et le buildserver (solution sale), soit inclus dans votre construction (moins sale).

Buildscript:

Xcopy.exe /Y "$(TargetPath)" "$(ProjectDir)\Package\Lib" 
cd "$(ProjectDir)Package" 
"$(TargetDir)..\Buildscripts\Nuget.exe" pack MyPackage.nuspec xcopy /Y *.nupkg "$(TargetDir)" 

Pour pouvoir utiliser ceci, la seule chose dont vous devez vous occuper est de décider où archiver le fichier nuget.exe. J'ai créé un dossier buildscripts au dernier niveau de mon arbre de développement.

10
Schwarzie2478

Si vous êtes dans un environnement TFS 2010, le projet NuGetter devrait résoudre le problème de la création automatique de paquets de nugets. Il crée un paquet pour toute la construction. Il s’agit en fait d’un workflow de génération TFS 2010 qui effectue le travail en appelant nuget.exe avec certains arguments. 

7
Alex

J'ai créé une extension Visual Studio de type projet (.nuproj) appelée NuBuild qui devrait faire ce que vous voulez. Il vous permet de construire vos packages NuGet à partir de Visual Studio et de MSBuild. Vous pouvez l'installer à partir de gallery ou obtenir le code source sous github .

7
Brent M. Spell

Installez le paquet NuGet Powertools dans votre sln et il ajoutera une cible de construction pour créer le nupkg puis modifiera simplement votre CI pour exécuter cette tâche également. http://nuget.org/packages/NuGetPowerTools

4

Une suggestion simple qui pourrait fonctionner assez bien ... il suffit de le mettre comme événement Postbuild dans le fichier .csproj:

  <PropertyGroup>
    <PostBuildEvent>$(SolutionDir)<YourPathToNugetHere>\NuGet.exe pack $(ProjectPath) -OutputDirectory ..\..\$(OutDir) -IncludeReferencedProjects -Symbols -Properties Configuration=$(Configuration)</PostBuildEvent>
  </PropertyGroup>

Cela collectera votre fichier .nuspec personnalisé (qui doit être nommé comme le fichier .csproj) et construira le fichier .nupkg.

C'est tout.

Vous pouvez même le faire simplement dans les paramètres de Visual Studio Project.

1
Beachwalker

Il existe le package Nuget CreateNewNuGetPackageFromProjectAfterEachBuild qui prétend pouvoir faire ce que vous voulez. Il existe également un documentation/site de projet.

1
habakuk

Autant que je sache, vous ne pouvez pas.

Exécutez-le correctement et utilisez un environnement/processus de construction approprié qui déclenche un script de construction lors de la validation/transmission vers votre référentiel principal et effectuant les opérations suivantes:

  • Cloner/tirer les modifications.
  • Construire la solution.
  • Construire des packages.
  • Télécharger des packages sur le serveur de packages.

Vous pouvez exécuter TeamCity, CruiseControl.NET ou un autre serveur de CI sur un VM ou sur votre serveur de génération existant.

0
Neil Barnwell

Installez le package de nuget 'NuGet.for.MSBuild'. Aucun fichier '.nuspec' n'est requis et les informations requises seront extraites du fichier AssemblyInfo.cs. 

Définissez la construction en mode 'Release'. Une fois construit, le fichier nupkg sera dans le dossier 'bin/Release'. 

https://nuget4msbuild.codeplex.com/

0
CountZero