Можно ли обойтись без добавления этих DLL-файлов при установке пакета NuGet?

10

Я начал с чтения предложенного вопроса, похожего на мой, но решения не было: почему 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 и воспроизвести проблему следующим образом:

  1. Найдите ClientLibrary.1.0.0.nupkg в client-library-repro-nuget-issue / ClientLibrary /

  2. Откройте консоль диспетчера пакетов для target-project-repro-nuget-issue и запустите

Install-Package C:\Path\To\client-library-repro-nuget-issue\ClientLibrary\ClientLibrary.1.0.0.nupkg
  1. Обратите внимание на 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:

  1. Сборка ClientLibraryи MainFrameworkпроекты для создания своих .dll
  2. Перейдите в 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>
  1. Выполнить nuget pack -IncludeReferencedProjects- потому ClientLibraryчто зависит от MainFramework(и нескольких других используемых пакетов MainFramework)

  2. Перейдите к TargetProject, откройте Консоль диспетчера пакетов

  3. Запустить Install-Package C:\Path\To\ClientLibrary.1.0.0.nupkg

Установка проходит успешно, а затем .dllя жаловался на добавление.

Проблема:

MainFrameworkимеет NUnitи NUnit3TestAdapterNuGet пакеты установлены. 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 и зависимости, и понять, почему это было проблемой в первое место. Спасибо за чтение.

Кристин
источник
1
Вам нужно будет предоставить примеры проектов, чтобы проиллюстрировать поведение.
Лекс Ли
@LexLi Я обновил описание своего проекта двумя примерами репозиториев, которые иллюстрируют поведение, вместе с шагами репро.
Кристина
3
Код показывает плохой подход к наличию зависимостей NUnit в MainFramework.csproj. Можете ли вы переместить их в отдельный проект модульного тестирования, такой как MainFramework.UnitTest.csproj?
Лекс Ли
Это имеет смысл , - ClientLibraryиспользует только некоторые части MainFramework, так что, MainFrameworkбезусловно , может быть разделена на MainFramework.Frameworkи MainFramework.Test, где NUnitзависимости существуют только в MainFramework.Test, и ClientLibraryиспользует только MainFramework.Framework. Спасибо за анализ.
Кристина

Ответы:

7

В целом, рекомендуется хранить все свои тесты и соответствующие пакеты NuGet в своем собственном проекте. Затем убедитесь, что ни один из проектов не ссылается на тестовый проект.

введите описание изображения здесь

На делать не сторону, Клиентская библиотека будет включать DLLs NUnit , потому что они были добавлены в проект , который ссылается Библиотека клиента.

В то время как на стороне do , клиентская библиотека не будет включать dll NUnit, поскольку ни одна из них не ссылается на тестовый проект.

sspaniel
источник
2
Спасибо за разбивку и объяснение - я реализовал эту практику, разделив свой проект, как вы и другой пользователь предложил. Это похоже на гораздо лучшую практику, чем то, что я делал ранее, и моя проблема также была решена.
Кристина