Posso aggirare l'aggiunta di questi .dll durante l'installazione del pacchetto NuGet?


10

Ho iniziato leggendo questa domanda suggerita simile alla mia, ma non c'era soluzione: perché MSTest.TestAdapter aggiunge le sue DLL nel mio pacchetto NuGet?

Descrizione rapida del problema

Ho scritto un pacchetto NuGet, e ogni volta che lo installo, NUnite NUnit3TestAdapter .dllvengo aggiunto al progetto su cui ho installato. Voglio trovare una soluzione che risolva questo problema.

Ripetere i passaggi

Ho spinto due repository git che riproducono il problema che sto descrivendo.

ClientLibrary/ MainFramework(progetto dal quale ho generato il pacchetto NuGet) - https://github.com/harbourc/client-library-repro-nuget-issue

TargetProject(progetto su cui installare il pacchetto) - https://github.com/harbourc/target-project-repro-nuget-issue

È possibile clonare entrambi i repository, ripristinare i relativi pacchetti NuGet e riprodurre il problema come segue:

  1. Trova ClientLibrary.1.0.0.nupkg in client-library-repro-nuget-issue / ClientLibrary /

  2. Aprire la console di gestione dei pacchetti per target-project-repro-nuget-issue ed eseguire

Install-Package C:\Path\To\client-library-repro-nuget-issue\ClientLibrary\ClientLibrary.1.0.0.nupkg
  1. Nota gli NUnite NUnit3TestAdapter .dllche vengono aggiunti in TargetProject- anche se sono TargetProjectgià installati NUnite NUnit3TestAdapterinstallati.

Panoramica più lunga

Ho creato il mio pacchetto NuGet per uso interno, chiamato ClientLibrary, e sto tentando di installarlo su un altro progetto, chiamato TargetProject. Ecco una rapida suddivisione della struttura:

  • FullSolution.sln
    • MainFramework.csproj
    • ClientLibrary.csproj-> .nupkggenerato da questo

Progetto separato:

  • TargetProject.sln
    • TargetProject.csproj-> installa .nupkgsu questo

ClientLibraryha un riferimento a MainFrameworke utilizza molti metodi da MainFramework.

Durante l'installazione ClientLibrary.1.0.0.nupkgsu TargetProject, .dllvengono aggiunti a TargetProject:

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

Se li elimino .dll, tutto funziona benissimo, perché TargetProjectgià quei pacchetti sono già installati. Non sono necessari, è solo fastidioso doverli eliminare durante l'installazione.

Ecco come sto aggiungendo il ClientLibrarypacchetto NuGet a TargetProject:

  1. Costruisci ClientLibrarye MainFrameworkprogetti per generare i loro .dlls
  2. Cambia directory in ClientLibrarycartella ed eseguinuget spec

.nuspec il file viene generato:

<?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. Esegui nuget pack -IncludeReferencedProjects- Perché ClientLibraryha una dipendenza da MainFramework(e molti altri pacchetti utilizzati da MainFramework)

  2. Passare a TargetProject, aprire Console Gestione pacchetti

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

L'installazione è andata a buon fine e poi quelli .dlldi cui mi sto lamentando vengono aggiunti.

Problema:

MainFrameworkha NUnite NUnit3TestAdapterpacchetti Nuget installati. ClientLibrary non. Quindi, .dllsembra che vengano aggiunti perché installati MainFramework, ma NON installati ClientLibrary. (Ricorda, ClientLibraryriferimenti MainFramework.dll.)

Ci sono altri pacchetti installati su entrambi MainFrameworke ClientLibrary, e questi non hanno quelli .dllche vengono aggiunti TargetProjectdurante l'installazione, quindi presumo che il problema sia causato dalla presenza di pacchetti presenti MainFrameworkma NON in ClientLibrary.

Credo di poter "risolvere" questo problema installando NUnit e NUnit3TestAdaptersu ClientLibrary, ma in ClientLibraryrealtà non usa affatto quei pacchetti, quindi non sembra necessario.

Come posso installare ClientLibrarysul TargetProjectsenza includere le NUnite NUnit3TestAdapter .dlls', e senza dover installare NUnite NUnit3TestAdaptersu ClientLibrary? Se possibile, vorrei dire ClientLibrary.1.0.0.nupkgdi usare i pacchetti NUnite NUnit3TestAdapterche sono già installati TargetProject.

Se la risposta è "Non possibile", va bene, ma vorrei una spiegazione - il mio obiettivo generale per questa domanda è di comprendere meglio come funzionano NuGet e le dipendenze e capire perché questo è stato un problema nel primo posto. Grazie per aver letto.


1
Dovrai fornire progetti di esempio per illustrare il comportamento.
Lex Li,

@LexLi Ho aggiornato la descrizione del mio progetto con due repository di esempio che illustrano il comportamento, insieme ai passaggi di riproduzione.
Christine,

3
Il codice mostra un approccio errato per avere dipendenze NUnit in MainFramework.csproj. Puoi spostarli in un progetto di unit test separato, come MainFramework.UnitTest.csproj?
Lex Li,

Questo ha senso: ClientLibraryusa solo alcune parti di MainFramework, quindi MainFrameworkpuò certamente essere suddiviso in MainFramework.Frameworke MainFramework.Test, dove NUnitesistono solo le dipendenze MainFramework.Teste ClientLibrarysolo utilizza MainFramework.Framework. Grazie per l'analisi.
Christine,

Risposte:


7

In generale, è consigliabile mantenere tutti i test e i pacchetti NuGet corrispondenti nel proprio progetto. Quindi assicurarsi che nessuno dei progetti faccia riferimento al progetto di test.

inserisci qui la descrizione dell'immagine

Sul non parte, Client Library includerà le DLL NUnit perché sono stati aggiunti a un progetto che fa riferimento Client Library.

Considerando il lato do , la Libreria client non includerà le dll NUnit perché non fanno riferimento al progetto di test.


2
Grazie per la ripartizione e la spiegazione: ho implementato questa pratica suddividendo il mio progetto come hai suggerito te e un altro utente. Sembra una pratica molto migliore di quella che stavo facendo in precedenza e anche il mio problema è stato risolto.
Christine,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.