我可以在安装 NuGet 包时解决添加这些 .dll 问题吗?

Chr*_*ine 11 .net c# dll nuget

我首先通读了这个类似于我的建议问题,但没有解决方案:为什么 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
Run Code Online (Sandbox Code Playgroud)
  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.nupkg到 时TargetProject,将.dll添加以下内容TargetProject

nunit.engine.api.dll
nunit.engine.dll
NUnit3.TestAdapter.dll
NUnit3.TestAdapter.pdb
Run Code Online (Sandbox Code Playgroud)

如果我删除这些.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>
Run Code Online (Sandbox Code Playgroud)
  1. 运行nuget pack -IncludeReferencedProjects- 因为ClientLibrary依赖于MainFramework(以及使用的其他几个包MainFramework

  2. 导航到TargetProject,打开包管理器控制台

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

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

问题:

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

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

我相信我可以通过安装NUnitNUnit3TestAdapteron来“修复”这个问题ClientLibrary,但ClientLibrary实际上根本不使用这些包,所以这似乎是不必要的。

如何ClientLibraryTargetProject不包含NUnitNUnit3TestAdapter .dll的情况下安装到,并且无需安装NUnitNUnit3TestAdapterClientLibrary?如果可能的话,我想告诉ClientLibrary.1.0.0.nupkg使用NUnitNUnit3TestAdapter被包已经安装上TargetProject

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

ssp*_*iel 7

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

在此处输入图片说明

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

而在do方面,客户端库将不包含 NUnit dll,因为它们都不引用测试项目。

  • 感谢您的细分和解释 - 我通过像您和其他用户建议的那样拆分我的项目来实现这种做法。这感觉比我之前做的要好得多,而且我的问题也得到了解决。 (2认同)