web-dev-qa-db-fra.com

Archiver des packages de NuGet dans le contrôle de version?

Avant NuGet, il était courant de reconnaître les "meilleures pratiques" pour l'archivage de toutes les DLL externes utilisées sur un projet. Généralement dans un Libs ou 3rdParty répertoire.

Lorsque je travaille avec NuGet, suis-je censé archiver le répertoire packages, ou existe-t-il un moyen pour MSBuild de télécharger automatiquement les packages nécessaires à partir du flux nuget?

87
Scott Weinstein

Depuis que j'ai posé la question, j'ai appliqué l'approche suivante pour ne pas avoir à archiver le répertoire toplovel Packages.

Dans un fichier build.msbuild de niveau supérieur:

<Target Name="NuGet">
    <ItemGroup>
       <NuGetPackage Include="*\packages.config" />
    </ItemGroup>
    <Exec Command='libs\NuGet.exe install "%(NuGetPackage.FullPath)" -o Packages'  />

    <!-- optional for project that has JavaScript content -->
    <CreateItem Include="Packages\*\Content\Scripts\*">
       <Output TaskParameter="Include" ItemName="NuGetJSFiles"/>
    </CreateItem>
    <Copy SourceFiles="@(NuGetJSFiles)" DestinationFolder="MainProj\Scripts\" OverwriteReadOnlyFiles="true" SkipUnchngedFiles="true" />
    <Delete Files="MainProj\Scripts\.gitignore" />
    <WriteLinesToFile File="MainProj\Scripts\.gitignore" Lines="%(NuGetJSFiles.Filename)%(NuGetJSFiles.Extension)" /
    <Delete Files="@(PostNuGetFiles)" />
</Target>

Dans chaque fichier project.csproj

<Target Name="BeforeBuild">
    <Error Condition="!Exists('..\Packages\')" Text="You must run &gt; msbuild build.msbuild to download required NuGet
Packages" />

    <!-- optional for project that has JavaScript content -->
   <ReadLinesFromFile File="Scripts\.gitignore">
     <Output TaskParameter="Lines" ItemName="ReqJSFiles" />
   </ReadLinesFromFile>
   <Message Text="@(ReqJSFiles)" />
   <Error Condition="!Exists('Scripts\%(ReqJSFiles.Identity)')" Text="You must run &gt; msbuild build.msbuild to download required NuGet JS Package - Scripts\%(ReqJSFiles.Identity)" />
 </Target>
5
Scott Weinstein

Non

Depuis que cette question a été posée, il existe maintenant un flux de travail facile à utiliser NuGet sans valider les packages pour le contrôle de code source

Depuis votre console de gestionnaire de paquets, vous devez installer les 'NuGetPowerTools' :

Install-Package NuGetPowerTools

Ensuite, pour permettre à vos projets de prendre en charge la restauration du pack, vous devez exécuter une autre commande:

Enable-PackageRestore

Vous êtes maintenant prêt à valider votre base de code sans le dossier packages. La commande précédente a modifié vos fichiers de projet afin que si des packages manquent, ils soient automatiquement téléchargés et ajoutés.

La source

tilisation de NuGet sans valider les packages pour le contrôle de code source

67
Edward Wilde

Oui. Considérez que le répertoire "packages" est équivalent à votre répertoire "libs" que vous avez mentionné dans votre question. C'est l'approche que j'adopte personnellement avec mes projets OSS.

Nous étudions les fonctionnalités qui permettraient à MSBuild de télécharger automatiquement les packages nécessaires, mais qui n'ont pas été implémentées (à partir de NuGet 1.1).

Je pense que certaines personnes ont peut-être déjà implémenté de telles fonctionnalités par elles-mêmes, mais notre plan est d'envisager d'avoir cette fonctionnalité intégrée à NuGet 1.2 ou 1.3, espérons-le.

31
Haacked

Malgré toutes les réponses ici, c'est toujours une horrible solution simple pour ne pas avoir toutes vos dépendances sous "une sorte" de contrôle de version.

Pour GIT, cela signifierait GIT-LFS.

Le récent épisode avec NPM montre pourquoi: si le référentiel Internet dont vous dépendez se casse, n'est pas disponible, etc., alors vous êtes foutu?

Vous n'êtes plus en mesure de construire votre matériel - et donc pas en mesure de livrer.

6

Je me rends compte que la réalité était différente lorsque cette question a été initialement publiée et répondue, mais heureusement, la réponse a un peu changé. Il est désormais possible d'utiliser NuGet pour télécharger des dépendances via MSBuild à l'aide d'un événement Pre-Build. Vous n'avez pas besoin de mettre le dossier des packages dans votre référentiel de code, toutes les dépendances seront téléchargées et/ou mises à jour lors de la construction. Cela peut être une solution de contournement, mais il semble assez décent. Voir le billet de blog suivant pour plus de détails: http://blog.davidebbo.com/2011/03/using-nuget-without-committing-packages.html

4
Pawel Krakowiak

Ce message est devenu très obsolète. La réponse est toujours NON, mais la solution a changé. Depuis NuGet 2.7+, vous pouvez activer la restauration automatique des packages sans inclure le fichier NuGet.exe dans votre source (c'est indésirable pour le moins) et si vous utilisez un DVCS moderne, vous pouvez ignorer le dossier packages. Si vous avez besoin de personnalisations spéciales, vous pouvez créer un fichier nuget.config à la racine de la solution.

http://docs.nuget.org/docs/reference/package-restore

En outre, avec le nouveau format csproj, vous pouvez également éviter les fichiers nuget.config supplémentaires car il est désormais intégré. Veuillez consulter cet article qui explique que mieux:

Le dossier .nuget doit-il être ajouté au contrôle de version?

3
Jeremy

Depuis le 20/09/13, il existe quelque chose appelé "Nuget Restore". En fait, vous n'avez pas à archiver le dossier du package si vous le souhaitez. (Surtout si vous utilisez DVCS)

Découvrez ceci: Utilisation de NuGet sans valider les packages pour le contrôle de code source http://docs.nuget.org/docs/workflows/using-nuget-without-committing-packages

3
Matt W