Puis-je contourner l'ajout de ces fichiers .dll lors de l'installation du package NuGet?

10

J'ai commencé par lire cette question suggérée similaire à la mienne, mais il n'y avait pas de résolution: pourquoi MSTest.TestAdapter ajoute ses DLL dans mon package NuGet?

Description rapide du problème

J'ai écrit un package NuGet, et chaque fois que je l'installe, NUnitet NUnit3TestAdapter .dllje suis ajouté au projet sur lequel j'ai installé. Je veux trouver une solution qui résout ce problème.

Étapes de repro

J'ai poussé deux dépôts git qui reproduisent le problème que je décris.

ClientLibrary/ MainFramework(projet à partir duquel j'ai généré le package NuGet) - https://github.com/harbourc/client-library-repro-nuget-issue

TargetProject(projet sur lequel le package doit être installé) - https://github.com/harbourc/target-project-repro-nuget-issue

Vous pouvez cloner les deux référentiels, restaurer leurs packages NuGet et reproduire le problème comme suit:

  1. Localisez ClientLibrary.1.0.0.nupkg dans client-library-repro-nuget-issue / ClientLibrary /

  2. Ouvrez la console du gestionnaire de packages pour le problème de projet-repro-nuget cible et exécutez

Install-Package C:\Path\To\client-library-repro-nuget-issue\ClientLibrary\ClientLibrary.1.0.0.nupkg
  1. Notez les NUnitet NUnit3TestAdapter .dll« s qui sont ajoutés dans TargetProject- même si TargetProjectdéjà NUnitet NUnit3TestAdapterinstallé.

Aperçu plus long

J'ai créé mon propre package NuGet pour un usage interne, appelé ClientLibrary, et j'essaie de l'installer sur un autre projet, appelé TargetProject. Voici une ventilation rapide de la structure:

  • FullSolution.sln
    • MainFramework.csproj
    • ClientLibrary.csproj-> .nupkggénéré à partir de cela

Projet séparé:

  • TargetProject.sln
    • TargetProject.csproj-> installer .nupkgsur ce

ClientLibrarya une référence à MainFrameworket utilise de nombreuses méthodes à partir de MainFramework.

Lors de l'installation ClientLibrary.1.0.0.nupkgsur TargetProject, les éléments suivants .dllsont ajoutés à TargetProject:

nunit.engine.api.dll
nunit.engine.dll
NUnit3.TestAdapter.dll
NUnit3.TestAdapter.pdb

Si je les supprime .dll, tout fonctionne bien, car TargetProjectces packages sont déjà installés de toute façon. Ils ne sont pas nécessaires, c'est juste ennuyeux de devoir les supprimer lors de l'installation.

Voici comment ClientLibraryj'ajoute le package NuGet à TargetProject:

  1. Générer ClientLibraryet MainFrameworkprojets pour générer leurs .dll
  2. Changez le répertoire en ClientLibrarydossier et exécuteznuget spec

.nuspec le fichier est généré:

<?xml version="1.0"?>
<package >
  <metadata>
    <id>ClientLibrary</id>
    <version>1.0</version>
    <title>Client Library</title>
    <authors>Myself</authors>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>Client library for interacting with my application.</description>
    <dependencies>
      <group targetFramework=".NETFramework4.7.2" />
    </dependencies>
  </metadata>
</package>
  1. Exécuter nuget pack -IncludeReferencedProjects- Parce ClientLibraryque dépend de MainFramework(et de plusieurs autres packages utilisés par MainFramework)

  2. Accédez à TargetProject, ouvrez la console du gestionnaire de packages

  3. Courir Install-Package C:\Path\To\ClientLibrary.1.0.0.nupkg

L'installation se déroule correctement, puis ceux dont .dllje me plains sont ajoutés.

Problème:

MainFrameworka NUnitet NUnit3TestAdapterpackages NuGet installés. ClientLibrary ne fait pas. Ainsi, les .dllfichiers semblent avoir été ajoutés car ils sont installés sur MainFramework, mais PAS installés sur ClientLibrary. (N'oubliez pas, ClientLibraryréférences MainFramework.dll.)

Il y a d' autres packages installés sur les deux MainFrameworket ClientLibrary, et ceux-ci n'en ont pas .dllajoutés TargetProjectlors de l'installation, donc je suppose que le problème est causé par la présence de packages dans MainFrameworkmais PAS dans ClientLibrary.

Je crois que je peux "résoudre" ce problème en installant NUnitet NUnit3TestAdaptersur ClientLibrary, mais ClientLibraryn'utilise pas du tout ces packages, donc cela semble inutile.

Comment puis-je installer ClientLibrarysur TargetProjectsans inclure le NUnitet NUnit3TestAdapter .dll, et sans avoir à installer NUnitet NUnit3TestAdaptersur ClientLibrary? Si possible, je voudrais dire ClientLibrary.1.0.0.nupkgd'utiliser les packages NUnitet NUnit3TestAdapterqui sont déjà installés sur TargetProject.

Si la réponse est "Pas possible", c'est bien, mais je voudrais une explication - mon objectif global pour cette question est de mieux comprendre comment NuGet et les dépendances fonctionnent, et de comprendre pourquoi cela a été un problème dans le première place. Merci pour la lecture.

Christine
la source
1
Vous devrez fournir des exemples de projets pour illustrer le comportement.
Lex Li
@LexLi J'ai mis à jour la description de mon projet avec deux exemples de référentiels qui illustrent le comportement, ainsi que des étapes de repro.
Christine
3
Le code montre une mauvaise approche pour avoir des dépendances NUnit dans MainFramework.csproj. Pouvez-vous les déplacer vers un projet de test unitaire distinct, tel que MainFramework.UnitTest.csproj?
Lex Li
Cela a du sens - ClientLibraryn'utilise que certaines parties de MainFramework, donc MainFrameworkpeut certainement être divisé en MainFramework.Frameworket MainFramework.Test, où les NUnitdépendances n'existent qu'en MainFramework.Test, et ClientLibraryn'utilisent que MainFramework.Framework. Merci pour l'analyse.
Christine

Réponses:

7

En général, il est recommandé de conserver tous vos tests et packages NuGet correspondants dans leur propre projet. Assurez-vous ensuite qu'aucun des projets ne fait référence au projet de test.

entrez la description de l'image ici

Côté non , la bibliothèque client inclura les DLL NUnit car elles ont été ajoutées à un projet référencé par la bibliothèque client.

Considérant que , do côté, bibliothèque client ne comprend pas le NUnit DLLs parce que ni référence le projet de test.

épagneul
la source
2
Merci pour la ventilation et l'explication - j'ai mis en œuvre cette pratique en divisant mon projet comme vous et un autre utilisateur l'avez suggéré. Cela semble être une bien meilleure pratique que ce que je faisais auparavant, et mon problème a également été résolu.
Christine