116 votes

Construire automatiquement le paquet NuGet en incluant les dépendances référencées

Je veux exécuter un dépôt NuGet local/interne . Je pense avoir trouvé comment "réutiliser" des paquets NuGet existants en les incluant dans un projet fictif à l'aide de NuGet et en scannant le fichier du paquet à récupère mon cache local .nupkg fichiers mais...

Comment créer un paquet nuget ( .nupkg ) d'un projet, incluant automatiquement tous dll et pas seulement celles récupérées via NuGet ?

Plus précisément :

  1. Créer une solution
  2. Ajouter un nouveau projet
  3. Ajouter des références à divers .dll dossiers/autres projets <-- c'est la partie manquante
  4. Ajouter les paquets NuGet via le gestionnaire de paquets / la ligne de commande / tout autre moyen.
  5. quelque chose crée automatiquement le .nupkg

D'après ce que j'ai trouvé, tu es supposé faire des choses comme

  • modifier manuellement votre .csproj pour ajouter <BuildPackage>true</BuildPackage> pour inclure les dépendances
  • créer manuellement un .nuspec et manuellement listez vos dépendances ( similaire ? )
  • exécuter manuellement nuget pack sur votre .nuspec fichier

Mais tout est manuel, ce qui est stupide. Même les solutions semi-automatiques sont toujours maladroites ou à moitié manuelles :

Je vais me contenter de quelque chose qui crée automatiquement un .nuspec manifeste des références du projet. Théoriquement, cela + l'événement de construction nuget peuvent être regroupés dans un paquet build-project/nuget, ce qui est ce que je veux vraiment voir.

104voto

Nailuj Points 7283

Votre point 3 ( Ajouter des références à divers fichiers .dll/autres projets <-- c'est la partie manquante ) contient en réalité deux problèmes différents : (1) ajouter des références à divers fichiers dll, et (2) ajouter des références à d'autres projets dans la même solution.

Le numéro (2) ici a reçu un soutien supplémentaire à partir de l'année dernière. NuGet 2.5 . Vous pouvez ajouter une option pour inclure des références à d'autres projets dans la même solution lors de la création d'un paquet NuGet pour un projet :

nuget pack projectfile.csproj -IncludeReferencedProjects
  • Si projectfile.csproj fait référence à d'autres projets de votre solution qui sont également exposés en tant que paquets NuGet. Paquets NuGet seront ajoutés comme dépendances.
  • S'il fait référence à des projets dans votre solution qui n'a pas s'exposent en tant que paquets NuGet, leurs dlls sera inclus dans ce paquet NuGet.

En ce qui concerne le point (1), si vous ajoutez souvent à vos projets des dll qui ne sont pas disponibles sous forme de paquets NuGet, vous pouvez simplement créer vos propres paquets NuGet (internes) avec ces fichiers. Si vous ajoutez ensuite ces dlls en tant que paquet NuGet au lieu des fichiers directement, ce paquet NuGet sera une dépendance dans le paquet NuGet de votre projet.

26voto

haxor Points 386

J'ai trouvé un article bien écrit sur ce sujet. J'ai le même problème avec certains paquets qui ont une hiérarchie de dépendances et jusqu'à présent, j'ai téléchargé chaque paquet NuGet séparément (quelle perte de temps).

Je viens de tester la solution trouvée ici : https://dev.to/wabbbit/include-both-nuget-package-references-and-project-reference-dll-using-dotnet-pack-2d8p

Et après examen du paquet NuGet à l'aide de NuGet Package Explorer, les DLLs produites par les projets référencés sont bien présentes. Je vais tester en soumettant réellement ce paquet à NuGet et en le testant.

Voici ma source, au cas où elle vous serait utile : https://github.com/jchristn/NuGetPackTest

Et le paquet NuGet de test : https://www.nuget.org/packages/NuGetPackTest/1.0.0

La solution semble bien fonctionner. Je ne sais pas à quoi cela va ressembler lorsqu'il y aura des couches de références, je suis sûr que cela pourrait devenir très compliqué et très rapide.

enter image description here

.csproj de la bibliothèque NuGetPackTest qui fait référence au projet TestLibrary (portions supprimées par souci de concision)

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFrameworks>netstandard2.0;netcoreapp3.0;netcoreapp3.1;net461</TargetFrameworks>
    ...
    <GeneratePackageOnBuild>true</GeneratePackageOnBuild>

    <!-- added this line -->
    <TargetsForTfmSpecificBuildOutput>$(TargetsForTfmSpecificBuildOutput);CopyProjectReferencesToPackage</TargetsForTfmSpecificBuildOutput>
  </PropertyGroup>

  <ItemGroup>

    <!-- modified this ProjectReference to include the children ReferenceOutputAssembly and IncludeAssets -->
    <ProjectReference Include="..\TestLibrary\TestLibrary.csproj">
      <ReferenceOutputAssembly>true</ReferenceOutputAssembly>
      <IncludeAssets>TestLibrary.dll</IncludeAssets>
    </ProjectReference>
  </ItemGroup>

  <!-- added this section -->
  <Target DependsOnTargets="ResolveReferences" Name="CopyProjectReferencesToPackage">
    <ItemGroup>
      <BuildOutputInPackage Include="@(ReferenceCopyLocalPaths->WithMetadataValue('ReferenceSourceTarget', 'ProjectReference'))"/>
    </ItemGroup>
  </Target>

</Project>

9voto

John Gietzen Points 23645

Pour les autres Googlers, vous pouvez l'utiliser si vous utilisez le fichier NuGet.targets pour exécuter NuGet Pack :

<Target Name="PrePackage" BeforeTargets="BuildPackage">
  <PropertyGroup>
    <BuildCommand>$(BuildCommand) -IncludeReferencedProjects</BuildCommand>
  </PropertyGroup>
</Target>

2voto

Regardez ça !

La solution que j'ai trouvée est une extension pour Visual Studio : https://visualstudiogallery.msdn.microsoft.com/fbe9b9b8-34ae-47b5-a751-cb71a16f7e96/view/Reviews

Il suffit d'ajouter un nouveau projet appelé NuGet Package : NuGet Package

Ensuite, vous ajoutez des projets intéressants à vos références et BOOOM ! !! Toutes les dépendances et les répertoires de fichiers sont automatiquement ajoutés. Si vous voulez modifier les données de NuSpec, cliquez droit sur le projet et allez dans Propriétés, puis modifiez ce que vous voulez. Les NuSpec et nupkg générés seront dans le dossier obj. de votre nouveau projet. J'espère que cela vous aidera ;).

2voto

PainElemental Points 429

J'ai résolu ce problème dans mon cas en ajoutant le TargetDir complet au paquet nuget. Ajoutez simplement ceci au fichier .csproj :

<Target Name="IncludeAllFilesInTargetDir" AfterTargets="Build">
  <ItemGroup>
    <None Include="$(TargetDir)\**">
      <Pack>true</Pack>
      <PackagePath>tools</PackagePath>
    </None>
  </ItemGroup>
</Target>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X