Kann ich das Hinzufügen dieser DLLs bei der Installation des NuGet-Pakets umgehen?

10

Ich habe zunächst diese vorgeschlagene Frage gelesen, die meiner ähnlich ist, aber es gab keine Lösung: Warum fügt MSTest.TestAdapter seine DLLs meinem NuGet-Paket hinzu?

Kurze Problembeschreibung

Ich schrieb ein NuGet Paket, und jedes Mal , wenn ich es installieren, NUnitund NUnit3TestAdapter .dllist mit dem Projekt , das ich auf installiert werden hinzugefügt. Ich möchte eine Lösung finden, die dieses Problem behebt.

Repro Schritte

Ich habe zwei Git-Repositories verschoben, die das von mir beschriebene Problem reproduzieren.

ClientLibrary/ MainFramework(Projekt, aus dem ich das NuGet-Paket generiert habe) - https://github.com/harbourc/client-library-repro-nuget-issue

TargetProject(Projekt, auf dem das Paket installiert werden soll) - https://github.com/harbourc/target-project-repro-nuget-issue

Sie können beide Repositorys klonen, ihre NuGet-Pakete wiederherstellen und das Problem wie folgt reproduzieren:

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

  2. Öffnen Sie die Paketmanagerkonsole für das Zielprojekt-Repro-Nuget-Problem und führen Sie sie aus

Install-Package C:\Path\To\client-library-repro-nuget-issue\ClientLibrary\ClientLibrary.1.0.0.nupkg
  1. Beachten Sie die NUnitund NUnit3TestAdapter .dll, die hinzugefügt werden TargetProject- obwohl TargetProjectbereits vorhanden NUnitund NUnit3TestAdapterinstalliert.

Längere Übersicht

Ich habe mein eigenes NuGet-Paket für den internen Gebrauch mit dem Namen erstellt ClientLibraryund versuche, es auf einem anderen Projekt mit dem Namen zu installieren TargetProject. Hier ist eine kurze Aufschlüsselung der Struktur:

  • FullSolution.sln
    • MainFramework.csproj
    • ClientLibrary.csproj-> daraus .nupkggeneriert

Separates Projekt:

  • TargetProject.sln
    • TargetProject.csproj-> installieren .nupkgauf diese

ClientLibraryhat einen Verweis auf MainFrameworkund verwendet viele Methoden aus MainFramework.

Bei der Installation ClientLibrary.1.0.0.nupkgauf TargetProjectwerden folgende .dllElemente hinzugefügt TargetProject:

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

Wenn ich diese lösche .dll, funktioniert alles einwandfrei, da TargetProjectdiese Pakete ohnehin schon installiert sind. Sie sind nicht erforderlich, es ist nur ärgerlich, sie bei der Installation löschen zu müssen.

So füge ich das ClientLibraryNuGet-Paket hinzu TargetProject:

  1. Build ClientLibraryund MainFrameworkProjekte zum Generieren ihrer DLLs
  2. Wechseln Sie in das Verzeichnis ClientLibraryund führen Sie es ausnuget spec

.nuspec Datei wird generiert:

<?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. Ausführen nuget pack -IncludeReferencedProjects- Weil ClientLibraryeine Abhängigkeit von MainFramework(und mehreren anderen von MainFramework) verwendeten Paketen besteht

  2. Navigieren Sie zu TargetProjectund öffnen Sie die Package Manager-Konsole

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

Die Installation wird erfolgreich ausgeführt, und dann werden die .dll, über die ich mich beschwere, hinzugefügt.

Problem:

MainFrameworkhat NUnitund NUnit3TestAdapterNuGet-Pakete installiert. ClientLibrary nicht. Die .dllscheinen also hinzugefügt zu werden, weil sie installiert sind MainFramework, aber NICHT installiert sind ClientLibrary. (Denken Sie daran, ClientLibraryReferenzen MainFramework.dll.)

Auf beiden und sind andere Pakete installiert , und diese haben keine, die bei der Installation hinzugefügt werden. Ich gehe daher davon aus , dass das Problem dadurch verursacht wird, dass Pakete vorhanden sind, aber NICHT in .MainFrameworkClientLibrary.dllTargetProjectMainFrameworkClientLibrary

Ich glaube , ich kann „fix“ dieses Problem durch die Installation NUnitund NUnit3TestAdapterauf ClientLibrary, aber ClientLibrarynicht wirklich die Pakete überhaupt zu verwenden, so ist es nicht notwendig zu sein scheint.

Wie kann ich installieren ClientLibraryauf , TargetProjectohne einschließlich der NUnitund NUnit3TestAdapter .dll‚s, und ohne zu installieren NUnitund NUnit3TestAdapterauf ClientLibrary? Wenn möglich, möchte ich Ihnen mitteilen ClientLibrary.1.0.0.nupkg, dass Sie die NUnitund NUnit3TestAdapterPakete verwenden sollen, auf denen bereits installiert ist TargetProject.

Wenn die Antwort "Nicht möglich" lautet, ist das in Ordnung, aber ich hätte gerne eine Erklärung - mein übergeordnetes Ziel für diese Frage ist es, ein besseres Verständnis der Funktionsweise von NuGet und Abhängigkeiten zu erlangen und zu verstehen, warum dies ein Problem in der EU war erster Platz. Danke fürs Lesen.

Christine
quelle
1
Sie müssen Beispielprojekte bereitstellen, um das Verhalten zu veranschaulichen.
Lex Li
@LexLi Ich habe meine Projektbeschreibung mit zwei Beispiel-Repositorys aktualisiert, die das Verhalten zusammen mit Repro-Schritten veranschaulichen.
Christine
3
Der Code zeigt einen schlechten Ansatz für NUnit-Abhängigkeiten in MainFramework.csproj. Können Sie sie in ein separates Unit-Test-Projekt wie MainFramework.UnitTest.csproj verschieben?
Lex Li
Das macht Sinn - verwendet ClientLibrarynur einige Teile von MainFramework, MainFrameworkkann also sicherlich in MainFramework.Frameworkund aufgeteilt werden MainFramework.Test, wo die NUnitAbhängigkeiten nur in existieren MainFramework.Testund ClientLibrarynur nutzen MainFramework.Framework. Danke für die Analyse.
Christine

Antworten:

7

Im Allgemeinen empfiehlt es sich, alle Ihre Tests und entsprechenden NuGet-Pakete in einem eigenen Projekt zu speichern. Stellen Sie dann sicher, dass keines der Projekte auf das Testprojekt verweist.

Geben Sie hier die Bildbeschreibung ein

Auf der Nicht- Seite enthält die Client-Bibliothek die NUnit-DLLs, da sie einem Projekt hinzugefügt wurden, auf das die Client-Bibliothek verweist.

Auf der Do- Seite enthält die Client-Bibliothek keine NUnit-DLLs, da weder auf das Testprojekt verwiesen wird.

sspaniel
quelle
2
Vielen Dank für die Aufschlüsselung und Erklärung. Ich habe diese Vorgehensweise implementiert, indem ich mein Projekt so aufgeteilt habe, wie Sie und ein anderer Benutzer es vorgeschlagen haben. Dies scheint eine viel bessere Übung zu sein als das, was ich zuvor getan habe, und mein Problem wurde ebenfalls gelöst.
Christine