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ć, NUnit
a 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:
Zlokalizuj ClientLibrary.1.0.0.nupkg w kliencie-biblioteki-repro-nuget-problem / ClientLibrary /
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
- Zwróć uwagę na
NUnit
iNUnit3TestAdapter
.dll
, które są dodawane doTargetProject
- mimo że sąTargetProject
już zainstalowaneNUnit
iNUnit3TestAdapter
zainstalowane.
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
->.nupkg
wygenerowane z tego
Oddzielny projekt:
TargetProject.sln
TargetProject.csproj
-> zainstaluj.nupkg
na tym
ClientLibrary
ma odniesienie do MainFramework
i używa wielu metod z MainFramework
.
Podczas instalowania ClientLibrary.1.0.0.nupkg
do TargetProject
, .dll
dodawane 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 TargetProject
już te pakiety są już zainstalowane. Nie są konieczne, po prostu irytujące jest ich usunięcie podczas instalacji.
Oto jak ClientLibrary
dodam pakiet NuGet do TargetProject
:
- Budowa
ClientLibrary
iMainFramework
projekty generują swoje .dlls - Zmień katalog na
ClientLibrary
folder 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>
Uruchom
nuget pack -IncludeReferencedProjects
- ponieważClientLibrary
ma zależność odMainFramework
(i kilku innych pakietów używanych przezMainFramework
)Przejdź do
TargetProject
, otwórz konsolę Menedżera pakietów- Biegać
Install-Package C:\Path\To\ClientLibrary.1.0.0.nupkg
Instalacja przebiega pomyślnie, a potem .dll
narzekam na dodanie.
Problem:
MainFramework
ma NUnit
i NUnit3TestAdapter
zainstalowane pakiety NuGet. ClientLibrary
nie. Wygląda na .dll
to, że zostały dodane, ponieważ są zainstalowane MainFramework
, ale NIE są zainstalowane ClientLibrary
. (Pamiętaj, ClientLibrary
referencje MainFramework.dll
.)
Istnieją inne pakiety zainstalowane na obu MainFramework
i ClientLibrary
, i te nie mają tych, .dll
które są dodawane TargetProject
podczas instalacji, więc zakładam, że problem jest spowodowany obecnością pakietów, MainFramework
ale NIE w ClientLibrary
.
Wydaje mi się, że mogę „naprawić” ten problem, instalując go NUnit
i NUnit3TestAdapter
na nim ClientLibrary
, ale ClientLibrary
tak naprawdę nie używa tych pakietów, więc wydaje się to niepotrzebne.
Jak mogę zainstalować ClientLibrary
na, TargetProject
bez uwzględnienia NUnit
i NUnit3TestAdapter
.dll
, i bez konieczności instalacji NUnit
i NUnit3TestAdapter
na ClientLibrary
? Jeśli to możliwe, chciałbym powiedzieć, ClientLibrary.1.0.0.nupkg
aby użyć pakietów NUnit
i 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.
ClientLibrary
wykorzystuje tylko niektóre częściMainFramework
, więc zMainFramework
pewnością można je podzielić naMainFramework.Framework
iMainFramework.Test
, gdzieNUnit
zależności istnieją tylkoMainFramework.Test
iClientLibrary
tylko je wykorzystująMainFramework.Framework
. Dziękuję za analizę.Odpowiedzi:
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.
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.
źródło