Чи можу я обійти додавання цих .dlls під час встановлення пакету 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. Відкрийте консоль менеджера пакунків для цільового проекту-репро-нуга-випуску та запуску

Install-Package C:\Path\To\client-library-repro-nuget-issue\ClientLibrary\ClientLibrary.1.0.0.nupkg
  1. Зверніть увагу на NUnitі NUnit3TestAdapter .dll«S, які додаються в 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наступні :.dllTargetProject

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

Якщо я видаляю ці .dll, все працює добре, тому TargetProjectщо ці пакети все одно встановлені. Вони не потрібні, просто дратує, що при установці потрібно видалити їх.

Ось як я ClientLibraryдодаю пакет NuGet до TargetProject:

  1. Створюйте ClientLibraryта MainFrameworkпроектуйте для створення своїх .dlls
  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і 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 та залежності, і зрозуміти, чому це було проблемою в першість. Дякую за прочитане


1
Вам потрібно буде надати зразкові проекти для ілюстрації поведінки.
Лекс Лі

@LexLi Я оновив опис свого проекту з двома типовими сховищами, які ілюструють поведінку, а також кроки повторної роботи.
Крістін

3
Код показує поганий підхід щодо залежності NUnit в MainFramework.csproj. Чи можете ви перемістити їх до окремого тестового проекту, наприклад MainFramework.UnitTest.csproj?
Lex Li

Це має сенс - ClientLibraryвикористовуються лише деякі частини MainFramework, тому, MainFrameworkбезумовно, їх можна розділити MainFramework.Frameworkі MainFramework.Test, коли NUnitзалежності існують лише MainFramework.Testі ClientLibraryвикористовуються MainFramework.Framework. Дякую за аналіз
Крістін

Відповіді:


7

Загалом, найкраща практика зберігати всі свої тести та відповідні пакети NuGet у власному проекті. Потім переконайтесь, що жоден з проектів не посилається на тестовий проект.

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

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

У той час як на зроби стороні, Клієнтська бібліотека не буде включати в себе NUnit DLLS , тому що ні посилання на тестовий проект.


2
Дякую за розбиття та пояснення - я застосував цю практику, розділивши свій проект, як ви запропонували ви та інший користувач. Це здається набагато кращою практикою, ніж те, що я раніше робив, і моє питання також було вирішено.
Крістін
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.