¿Puedo evitar agregar estos .dlls al instalar el paquete NuGet?

10

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, NUnity NUnit3TestAdapter .dllme 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:

  1. Localice ClientLibrary.1.0.0.nupkg en client-library-repro-nuget-issue / ClientLibrary /

  2. 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
  1. Tenga en cuenta los NUnity NUnit3TestAdapter .dll's que se agregan TargetProject, a pesar de que TargetProjectya tiene NUnite NUnit3TestAdapterinstalado.

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-> .nupkggenerado a partir de esto

Proyecto separado:

  • TargetProject.sln
    • TargetProject.csproj-> instalar .nupkgen esto

ClientLibrarytiene una referencia MainFrameworky utiliza muchos métodos de MainFramework.

Al instalar ClientLibrary.1.0.0.nupkgen TargetProject, .dllse 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 TargetProjecttodos modos ya tiene esos paquetes instalados. No son necesarios, es molesto tener que eliminarlos durante la instalación.

Así es como estoy agregando el ClientLibrarypaquete NuGet a TargetProject:

  1. Construye ClientLibraryy MainFrameworkproyecta para generar sus .dlls
  2. Cambie el directorio a la ClientLibrarycarpeta 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>
  1. Ejecutar nuget pack -IncludeReferencedProjects: porque ClientLibrarytiene una dependencia MainFramework(y varios otros paquetes utilizados por MainFramework)

  2. Vaya a TargetProject, abra la consola del Administrador de paquetes

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

La instalación se ejecuta con éxito, y de eso .dllme estoy quejando.

Problema:

MainFrameworktiene NUnity NUnit3TestAdapterpaquetes NuGet instalados. ClientLibrary no. Por lo tanto, .dllparece que se agregaron porque están instalados MainFramework, pero NO instalados ClientLibrary. (Recuerde, ClientLibraryreferencias MainFramework.dll).

Hay otros paquetes instalados en ambos MainFrameworky ClientLibrary, y estos no tienen .dlllos que se agregan TargetProjectdespués de la instalación, por lo que supongo que el problema es causado por tener paquetes presentes MainFrameworkpero NO en ClientLibrary.

Creo que puedo "solucionar" este problema instalando NUnity NUnit3TestAdapteren ClientLibrary, pero en ClientLibraryrealidad no usa esos paquetes, por lo que parece innecesario.

¿Cómo puedo instalar ClientLibraryen TargetProjectsin incluir los NUnity NUnit3TestAdapter .dll's, y sin tener que instalar NUnity NUnit3TestAdapteren ClientLibrary? Si es posible, me gustaría decirle ClientLibrary.1.0.0.nupkgque use los paquetes NUnity NUnit3TestAdapterque 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.

Christine
fuente
1
Deberá proporcionar proyectos de muestra para ilustrar el comportamiento.
Lex Li
@LexLi He actualizado la descripción de mi proyecto con dos repositorios de muestra que ilustran el comportamiento, junto con pasos de repro.
Christine
3
El código muestra un mal enfoque para tener dependencias NUnit en MainFramework.csproj. ¿Puede moverlos a un proyecto de prueba de unidad separado, como MainFramework.UnitTest.csproj?
Lex Li
Eso tiene sentido: ClientLibrarysolo usa algunas partes de MainFramework, por MainFrameworklo que ciertamente se puede dividir en MainFramework.Frameworky MainFramework.Test, donde las NUnitdependencias solo existen MainFramework.Testy ClientLibrarysolo se utilizan MainFramework.Framework. Gracias por el análisis.
Christine

Respuestas:

7

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.

ingrese la descripción de la imagen aquí

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.

sspaniel
fuente
2
Gracias por el desglose y la explicación: implementé esta práctica dividiendo mi proyecto como usted y otro usuario han sugerido. Esto parece una práctica mucho mejor que lo que estaba haciendo anteriormente, y mi problema también se ha resuelto.
Christine