Я начал с чтения предложенного вопроса, похожего на мой, но решения не было: почему MSTest.TestAdapter добавляет свои библиотеки DLL в мой пакет NuGet?
Краткое описание проблемы
Я написал пакет NuGet и каждый раз устанавливал его, NUnit
и NUnit3TestAdapter
.dll
меня добавляли в проект, на который я устанавливал. Я хочу найти решение, которое решает эту проблему.
Репро шаги
Я добавил два git-репозитория, которые воспроизводят описанную мной проблему.
ClientLibrary
/ MainFramework
(проект, из которого я создал пакет NuGet) - https://github.com/harbourc/client-library-repro-nuget-issue
TargetProject
(спроектируйте этот пакет для установки) - https://github.com/harbourc/target-project-repro-nuget-issue
Вы можете клонировать оба репозитория, восстановить их пакеты NuGet и воспроизвести проблему следующим образом:
Найдите ClientLibrary.1.0.0.nupkg в client-library-repro-nuget-issue / ClientLibrary /
Откройте консоль диспетчера пакетов для target-project-repro-nuget-issue и запустите
Install-Package C:\Path\To\client-library-repro-nuget-issue\ClientLibrary\ClientLibrary.1.0.0.nupkg
- Обратите внимание на
NUnit
иNUnit3TestAdapter
.dll
, которые добавленыTargetProject
- даже если ониTargetProject
уже естьNUnit
иNUnit3TestAdapter
установлены.
Более длинный обзор
Я создал свой собственный пакет NuGet для внутреннего использования под названием ClientLibrary
, и я пытаюсь установить его в другой проект под названием TargetProject
. Вот быстрая разбивка структуры:
FullSolution.sln
MainFramework.csproj
ClientLibrary.csproj
->.nupkg
генерируется из этого
Отдельный проект:
TargetProject.sln
TargetProject.csproj
-> установить.nupkg
на это
ClientLibrary
имеет ссылку MainFramework
и использует много методов из MainFramework
.
При установке ClientLibrary.1.0.0.nupkg
на него добавляются TargetProject
следующие .dll
элементы TargetProject
:
nunit.engine.api.dll
nunit.engine.dll
NUnit3.TestAdapter.dll
NUnit3.TestAdapter.pdb
Если я удаляю их .dll
, все работает нормально, потому TargetProject
что эти пакеты уже установлены. Они не нужны, просто раздражает необходимость их удалять при установке.
Вот как я добавляю ClientLibrary
пакет NuGet TargetProject
:
- Сборка
ClientLibrary
иMainFramework
проекты для создания своих .dll - Перейдите в
ClientLibrary
папку и запуститеnuget spec
.nuspec
файл генерируется:
<?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>
Выполнить
nuget pack -IncludeReferencedProjects
- потомуClientLibrary
что зависит отMainFramework
(и нескольких других используемых пакетовMainFramework
)Перейдите к
TargetProject
, откройте Консоль диспетчера пакетов- Запустить
Install-Package C:\Path\To\ClientLibrary.1.0.0.nupkg
Установка проходит успешно, а затем .dll
я жаловался на добавление.
Проблема:
MainFramework
имеет NUnit
и NUnit3TestAdapter
NuGet пакеты установлены. ClientLibrary
не. Таким образом, .dll
кажется, что они добавлены, потому что они установлены MainFramework
, но НЕ установлены ClientLibrary
. (Помните, ClientLibrary
ссылки MainFramework.dll
.)
Есть и другие пакеты, установленные на обоих, MainFramework
и ClientLibrary
, и они не имеют .dll
добавленных TargetProject
при установке, поэтому я предполагаю, что проблема вызвана наличием пакетов в, MainFramework
но НЕ в ClientLibrary
.
Я считаю , что может «исправить» эту проблему путем установки NUnit
и NUnit3TestAdapter
на ClientLibrary
, но на ClientLibrary
самом деле не использовать эти пакеты на всех, так что кажется ненужным.
Как я могу установить ClientLibrary
на TargetProject
без включения NUnit
и NUnit3TestAdapter
.dll
«с, и без необходимости устанавливать NUnit
и NUnit3TestAdapter
на ClientLibrary
? Если возможно, я хотел бы сказать, ClientLibrary.1.0.0.nupkg
чтобы использовать NUnit
и NUnit3TestAdapter
пакеты, которые уже установлены на TargetProject
.
Если ответ «Не возможно», то это хорошо, но я хотел бы получить объяснение - моя общая цель для этого вопроса - лучше понять, как работает NuGet и зависимости, и понять, почему это было проблемой в первое место. Спасибо за чтение.
ClientLibrary
использует только некоторые частиMainFramework
, так что,MainFramework
безусловно , может быть разделена наMainFramework.Framework
иMainFramework.Test
, гдеNUnit
зависимости существуют только вMainFramework.Test
, иClientLibrary
использует толькоMainFramework.Framework
. Спасибо за анализ.Ответы:
В целом, рекомендуется хранить все свои тесты и соответствующие пакеты NuGet в своем собственном проекте. Затем убедитесь, что ни один из проектов не ссылается на тестовый проект.
На делать не сторону, Клиентская библиотека будет включать DLLs NUnit , потому что они были добавлены в проект , который ссылается Библиотека клиента.
В то время как на стороне do , клиентская библиотека не будет включать dll NUnit, поскольку ни одна из них не ссылается на тестовый проект.
источник