Czy mogę obejść dodawanie tych plików DLL podczas instalowania pakietu NuGet?

10

Zacząłem od przeczytania tego sugerowanego pytania podobnego do mojego, ale nie było rozwiązania: Dlaczego MSTest.TestAdapter dodaje swoje biblioteki DLL do mojego pakietu NuGet?

Krótki opis problemu

Napisałem pakiet Nuget, i za każdym razem go zainstalować, NUnita NUnit3TestAdapter .dll„s dodane do projektu I zainstalowany. Chcę znaleźć rozwiązanie, które naprawi ten problem.

Kroki repro

Przekazałem dwa repozytoria git, które odtwarzają opisywany przeze mnie problem.

ClientLibrary/ MainFramework(projekt, z którego wygenerowałem pakiet NuGet) - https://github.com/harbourc/client-library-repro-nuget-issue

TargetProject(projekt, na którym pakiet ma zostać zainstalowany) - https://github.com/harbourc/target-project-repro-nuget-issue

Możesz sklonować oba repozytoria, przywrócić ich pakiety NuGet i odtworzyć problem w następujący sposób:

  1. Zlokalizuj ClientLibrary.1.0.0.nupkg w kliencie-biblioteki-repro-nuget-problem / ClientLibrary /

  2. Otwórz konsolę menedżera pakietów dla wydania target-project-repro-nuget i uruchom

Install-Package C:\Path\To\client-library-repro-nuget-issue\ClientLibrary\ClientLibrary.1.0.0.nupkg
  1. Zwróć uwagę na NUniti NUnit3TestAdapter .dll, które są dodawane do TargetProject- mimo że są TargetProjectjuż zainstalowane NUniti NUnit3TestAdapterzainstalowane.

Dłuższy przegląd

Utworzyłem własny pakiet NuGet do użytku wewnętrznego, o nazwie ClientLibrary, i próbuję zainstalować go w innym projekcie o nazwie TargetProject. Oto szybki podział struktury:

  • FullSolution.sln
    • MainFramework.csproj
    • ClientLibrary.csproj-> .nupkgwygenerowane z tego

Oddzielny projekt:

  • TargetProject.sln
    • TargetProject.csproj-> zainstaluj .nupkgna tym

ClientLibraryma odniesienie do MainFrameworki używa wielu metod z MainFramework.

Podczas instalowania ClientLibrary.1.0.0.nupkgdo TargetProject, .dlldodawane są następujące elementy TargetProject:

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

Jeśli je usunę .dll, wszystko działa poprawnie, ponieważ i tak TargetProjectjuż te pakiety są już zainstalowane. Nie są konieczne, po prostu irytujące jest ich usunięcie podczas instalacji.

Oto jak ClientLibrarydodam pakiet NuGet do TargetProject:

  1. Budowa ClientLibraryi MainFrameworkprojekty generują swoje .dlls
  2. Zmień katalog na ClientLibraryfolder i uruchomnuget spec

.nuspec plik jest generowany:

<?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. Uruchom nuget pack -IncludeReferencedProjects- ponieważ ClientLibraryma zależność od MainFramework(i kilku innych pakietów używanych przez MainFramework)

  2. Przejdź do TargetProject, otwórz konsolę Menedżera pakietów

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

Instalacja przebiega pomyślnie, a potem .dllnarzekam na dodanie.

Problem:

MainFrameworkma NUniti NUnit3TestAdapterzainstalowane pakiety NuGet. ClientLibrary nie. Wygląda na .dllto, że zostały dodane, ponieważ są zainstalowane MainFramework, ale NIE są zainstalowane ClientLibrary. (Pamiętaj, ClientLibraryreferencje MainFramework.dll.)

Istnieją inne pakiety zainstalowane na obu MainFrameworki ClientLibrary, i te nie mają tych, .dllktóre są dodawane TargetProjectpodczas instalacji, więc zakładam, że problem jest spowodowany obecnością pakietów, MainFrameworkale NIE w ClientLibrary.

Wydaje mi się, że mogę „naprawić” ten problem, instalując go NUniti NUnit3TestAdapterna nim ClientLibrary, ale ClientLibrarytak naprawdę nie używa tych pakietów, więc wydaje się to niepotrzebne.

Jak mogę zainstalować ClientLibraryna, TargetProjectbez uwzględnienia NUniti NUnit3TestAdapter .dll, i bez konieczności instalacji NUniti NUnit3TestAdapterna ClientLibrary? Jeśli to możliwe, chciałbym powiedzieć, ClientLibrary.1.0.0.nupkgaby użyć pakietów NUniti NUnit3TestAdapter, które są już zainstalowane TargetProject.

Jeśli odpowiedź brzmi „Niemożliwe”, to dobrze, ale chciałbym wyjaśnienia - moim ogólnym celem tego pytania jest lepsze zrozumienie działania NuGet i zależności oraz zrozumienie, dlaczego jest to problem w pierwsze miejsce. Dziękuję za przeczytanie.

Christine
źródło
1
Będziesz musiał dostarczyć przykładowe projekty w celu zilustrowania tego zachowania.
Lex Li,
@LexLi Zaktualizowałem opis mojego projektu o dwa przykładowe repozytoria, które ilustrują zachowanie, wraz z krokami repro.
Christine
3
Kod pokazuje złe podejście do posiadania zależności NUnit w MainFramework.csproj. Czy możesz przenieść je do osobnego projektu testu jednostkowego, takiego jak MainFramework.UnitTest.csproj?
Lex Li,
Ma to sens - ClientLibrarywykorzystuje tylko niektóre części MainFramework, więc z MainFrameworkpewnością można je podzielić na MainFramework.Frameworki MainFramework.Test, gdzie NUnitzależności istnieją tylko MainFramework.Testi ClientLibrarytylko je wykorzystują MainFramework.Framework. Dziękuję za analizę.
Christine,

Odpowiedzi:

7

Ogólnie rzecz biorąc, najlepszą praktyką jest przechowywanie wszystkich testów i odpowiadających im pakietów NuGet we własnym projekcie. Następnie upewnij się, że żaden z projektów nie odwołuje się do projektu testowego.

wprowadź opis zdjęcia tutaj

Po stronie nie , biblioteka klienta będzie zawierać biblioteki DLL NUnit, ponieważ zostały one dodane do projektu, do którego odwołuje się biblioteka klienta.

Zważywszy na zrób strony Client Library nie będzie zawierała NUnit bibliotek DLL, ponieważ ani w odniesieniu do projektu testowego.

spaniel
źródło
2
Dziękuję za podział i wyjaśnienie - wdrożyłem tę praktykę, dzieląc mój projekt, tak jak sugerowaliście ty i inny użytkownik. Wydaje mi się, że jest to o wiele lepsza praktyka niż wcześniej, a mój problem został rozwiązany.
Christine,