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ęści MainFramework
, więc z MainFramework
pewnością można je podzielić na MainFramework.Framework
i MainFramework.Test
, gdzie NUnit
zależności istnieją tylko MainFramework.Test
i ClientLibrary
tylko je wykorzystują MainFramework.Framework
. Dziękuję za analizę.