安装NuGet软件包时,可以解决这些.dll问题吗?


10

我从阅读与我类似的建议问题开始,但是没有解决方案:为什么MSTest.TestAdapter将其DLL添加到我的NuGet包中?

快速问题描述

我写了一个NuGet包,每一次我安装它,NUnitNUnit3TestAdapter .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. 在client-library-repro-nuget-issue / ClientLibrary /中找到ClientLibrary.1.0.0.nupkg

  2. 打开包管理器控制台以执行target-project-repro-nuget-issue并运行

Install-Package C:\Path\To\client-library-repro-nuget-issue\ClientLibrary\ClientLibrary.1.0.0.nupkg
  1. 注意NUnitNUnit3TestAdapter .dll被加入的TargetProject-尽管TargetProject已经有了NUnitNUnit3TestAdapter安装。

更长的概述

我创建了自己的NuGet软件包供内部使用,名为ClientLibrary,并且尝试将其安装到另一个项目上TargetProject。这是结构的快速分解:

  • FullSolution.sln
    • MainFramework.csproj
    • ClientLibrary.csproj-> .nupkg由此产生

单独的项目:

  • TargetProject.sln
    • TargetProject.csproj->安装.nupkg到此

ClientLibrary引用MainFramework并使用了许多方法MainFramework

当安装ClientLibrary.1.0.0.nupkgTargetProject,下面.dll的越来越添加到TargetProject

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

如果删除这些.dll,一切正常,因为TargetProject无论如何已经安装了这些软件包。它们不是必需的,在安装时必须删除它们只是很烦人。

这是我将ClientLibraryNuGet包添加到的方式TargetProject

  1. 生成ClientLibraryMainFramework项目以生成其.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,打开Package Manager控制台

  3. Install-Package C:\Path\To\ClientLibrary.1.0.0.nupkg

安装成功运行,然后.dll我抱怨的那些被添加。

问题:

MainFramework拥有NUnitNUnit3TestAdapter安装的NuGet包。ClientLibrary 才不是。因此,.dll似乎已添加,因为它们已安装在上MainFramework,但未安装在上ClientLibrary。(请记住,ClientLibrary参考文献MainFramework.dll。)

还有其他安装在两个包MainFrameworkClientLibrary,而这些不具备.dll“是被添加至S TargetProject安装时,所以我假设的问题是通过具有包目前引起MainFramework而不是在ClientLibrary

我相信我能“修复”这个问题通过安装NUnitNUnit3TestAdapterClientLibrary,但ClientLibrary都没有真正使用这些软件包,因此它似乎没有必要。

如何安装ClientLibraryTargetProject不包括NUnitNUnit3TestAdapter .dll的,并且无需安装NUnitNUnit3TestAdapterClientLibrary?如果可能的话,我想告诉ClientLibrary.1.0.0.nupkg您使用上安装的NUnitNUnit3TestAdapter软件包。TargetProject

如果答案是“不可能”,那很好,但是我想解释一下-这个问题的总体目标是更好地了解NuGet和依赖项的工作方式,并理解为什么这一直是问题所在。第一名。感谢您的阅读。


1
您将必须提供示例项目来说明此行为。
Lex Li

@LexLi我用两个示例存储库更新了我的项目描述,这些存储库说明了行为以及复制步骤。
克里斯汀

3
该代码显示了在MainFramework.csproj中具有NUnit依赖项的糟糕方法。您可以将它们移到单独的单元测试项目中,例如MainFramework.UnitTest.csproj吗?
莱克斯李

这是有道理的- ClientLibrary仅使用的某些部分MainFramework,因此MainFramework当然可以拆分为MainFramework.FrameworkMainFramework.Test,其中NUnit依赖项仅存在于MainFramework.Test并且ClientLibrary仅利用MainFramework.Framework。感谢您的分析。
克里斯汀

Answers:


7

通常,最佳做法是将所有测试和相应的NuGet包保留在自己的项目中。然后,确保没有任何项目引用测试项目。

在此处输入图片说明

没有侧,客户端库将包括NUnit的dll文件,因为它们被添加到一个项目,客户端库引用。

而在执行方面,客户端库将不包含NUnit dll,因为两者均未引用测试项目。


2
感谢您提供的细目分类和解释-我通过像您和另一个用户建议的那样拆分项目来实现了这种做法。这感觉比以前更好,而且我的问题也已解决。
克里斯汀
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.