Comencé leyendo esta pregunta sugerida similar a la mía, pero no hubo solución: ¿Por qué MSTest.TestAdapter agrega sus DLL en mi paquete NuGet?
Descripción rápida del problema
Escribí un paquete NuGet, y cada vez que lo instalo, NUnit
y NUnit3TestAdapter
.dll
me agregan al proyecto en el que instalé. Quiero encontrar una solución que solucione este problema.
Repro pasos
He introducido dos repositorios git que reproducen el problema que estoy describiendo.
ClientLibrary
/ MainFramework
(proyecto del que generé el paquete NuGet) - https://github.com/harbourc/client-library-repro-nuget-issue
TargetProject
(proyecto en el que se instalará el paquete) - https://github.com/harbourc/target-project-repro-nuget-issue
Puede clonar ambos repositorios, restaurar sus paquetes NuGet y reproducir el problema de la siguiente manera:
Localice ClientLibrary.1.0.0.nupkg en client-library-repro-nuget-issue / ClientLibrary /
Abra la consola del administrador de paquetes para target-project-repro-nuget-issue y ejecute
Install-Package C:\Path\To\client-library-repro-nuget-issue\ClientLibrary\ClientLibrary.1.0.0.nupkg
- Tenga en cuenta los
NUnit
yNUnit3TestAdapter
.dll
's que se agreganTargetProject
, a pesar de queTargetProject
ya tieneNUnit
eNUnit3TestAdapter
instalado.
Descripción general más larga
He creado mi propio paquete NuGet para uso interno, llamado ClientLibrary
, y estoy intentando instalarlo en otro proyecto, llamado TargetProject
. Aquí hay un desglose rápido de la estructura:
FullSolution.sln
MainFramework.csproj
ClientLibrary.csproj
->.nupkg
generado a partir de esto
Proyecto separado:
TargetProject.sln
TargetProject.csproj
-> instalar.nupkg
en esto
ClientLibrary
tiene una referencia MainFramework
y utiliza muchos métodos de MainFramework
.
Al instalar ClientLibrary.1.0.0.nupkg
en TargetProject
, .dll
se agregan los siguientes a TargetProject
:
nunit.engine.api.dll
nunit.engine.dll
NUnit3.TestAdapter.dll
NUnit3.TestAdapter.pdb
Si elimino estos .dll
, todo funciona bien, porque de TargetProject
todos modos ya tiene esos paquetes instalados. No son necesarios, es molesto tener que eliminarlos durante la instalación.
Así es como estoy agregando el ClientLibrary
paquete NuGet a TargetProject
:
- Construye
ClientLibrary
yMainFramework
proyecta para generar sus .dlls - Cambie el directorio a la
ClientLibrary
carpeta y ejecutenuget spec
.nuspec
se genera el archivo:
<?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>
Ejecutar
nuget pack -IncludeReferencedProjects
: porqueClientLibrary
tiene una dependenciaMainFramework
(y varios otros paquetes utilizados porMainFramework
)Vaya a
TargetProject
, abra la consola del Administrador de paquetes- correr
Install-Package C:\Path\To\ClientLibrary.1.0.0.nupkg
La instalación se ejecuta con éxito, y de eso .dll
me estoy quejando.
Problema:
MainFramework
tiene NUnit
y NUnit3TestAdapter
paquetes NuGet instalados. ClientLibrary
no. Por lo tanto, .dll
parece que se agregaron porque están instalados MainFramework
, pero NO instalados ClientLibrary
. (Recuerde, ClientLibrary
referencias MainFramework.dll
).
Hay otros paquetes instalados en ambos MainFramework
y ClientLibrary
, y estos no tienen .dll
los que se agregan TargetProject
después de la instalación, por lo que supongo que el problema es causado por tener paquetes presentes MainFramework
pero NO en ClientLibrary
.
Creo que puedo "solucionar" este problema instalando NUnit
y NUnit3TestAdapter
en ClientLibrary
, pero en ClientLibrary
realidad no usa esos paquetes, por lo que parece innecesario.
¿Cómo puedo instalar ClientLibrary
en TargetProject
sin incluir los NUnit
y NUnit3TestAdapter
.dll
's, y sin tener que instalar NUnit
y NUnit3TestAdapter
en ClientLibrary
? Si es posible, me gustaría decirle ClientLibrary.1.0.0.nupkg
que use los paquetes NUnit
y NUnit3TestAdapter
que ya están instalados TargetProject
.
Si la respuesta es "No es posible", está bien, pero me gustaría una explicación: mi objetivo general para esta pregunta es obtener una mejor comprensión de cómo funcionan NuGet y las dependencias, y entender por qué esto ha sido un problema en el primer lugar. Gracias por leer.
ClientLibrary
solo usa algunas partes deMainFramework
, porMainFramework
lo que ciertamente se puede dividir enMainFramework.Framework
yMainFramework.Test
, donde lasNUnit
dependencias solo existenMainFramework.Test
yClientLibrary
solo se utilizanMainFramework.Framework
. Gracias por el análisis.Respuestas:
En general, es una buena práctica mantener todas sus pruebas y los paquetes NuGet correspondientes en su propio proyecto. Luego, asegúrese de que ninguno de los proyectos haga referencia al proyecto de prueba.
Por lo hagas lado, biblioteca de clientes incluirá los archivos DLL NUnit, ya que se han añadido a un proyecto que las referencias de biblioteca de cliente.
Mientras que en el lado do , Client Library no incluirá los dlls NUnit porque ninguno hace referencia al proyecto de prueba.
fuente