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

Posted

技术标签:

【中文标题】我可以在安装 NuGet 包时添加这些 .dll 吗?【英文标题】:Can I work around adding these .dlls when installing NuGet package? 【发布时间】:2019-12-12 20:39:52 【问题描述】:

我首先阅读了这个与我类似的建议问题,但没有解决方案:Why does MSTest.TestAdapter adds its DLLs into my NuGet package?

快速问题描述

我编写了一个 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 包,然后重现问题,如下所示:

    在 client-library-repro-nuget-issue/ClientLibrary/ 中找到 ClientLibrary.1.0.0.nupkg

    为 target-project-repro-nuget-issue 打开包管理器控制台并运行

Install-Package C:\Path\To\client-library-repro-nuget-issue\ClientLibrary\ClientLibrary.1.0.0.nupkg
    请注意添加到TargetProject 中的NUnitNUnit3TestAdapter .dll -- 即使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

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

这是我将ClientLibrary NuGet 包添加到TargetProject 的方式:

    构建 ClientLibraryMainFramework 项目以生成它们的 .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 已安装 NUnitNUnit3TestAdapter NuGet 包。 ClientLibrary 没有。因此,.dll 似乎已添加,因为它们安装在 MainFramework 上,但未安装在 ClientLibrary 上。 (记住,ClientLibrary 引用 MainFramework.dll。)

MainFrameworkClientLibrary 上都安装了 other 软件包,这些软件包没有在安装时添加到 TargetProject.dll,所以我假设有问题是由于 MainFramework 中存在包但 ClientLibrary 中不存在包引起的。

我相信我可以通过将NUnitNUnit3TestAdapter 安装到ClientLibrary 上来“解决”这个问题,但是ClientLibrary 实际上根本不使用这些包,所以似乎没有必要。

如何在不包括NUnitNUnit3TestAdapter .dll 的情况下将ClientLibrary 安装到TargetProject 上,并且不必将NUnitNUnit3TestAdapter 安装到ClientLibrary 上?如果可能,我想告诉ClientLibrary.1.0.0.nupkg 使用TargetProject已经安装的NUnitNUnit3TestAdapter 软件包。

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

【问题讨论】:

您必须提供示例项目来说明行为。 @LexLi 我已经更新了我的项目描述,其中包含两个说明行为的示例存储库以及重现步骤。 代码显示了在 MainFramework.csproj 中具有 NUnit 依赖项的错误方法。能否将它们移至单独的单元测试项目,例如 MainFramework.UnitTest.csproj? 有道理——ClientLibrary 只使用了MainFramework 的一部分,所以MainFramework 当然可以拆分为MainFramework.FrameworkMainFramework.Test,其中NUnit 依赖只存在在MainFramework.TestClientLibrary 中仅使用MainFramework.Framework。感谢您的分析。 【参考方案1】:

一般来说,最好将所有测试和相应的 NuGet 包保存在自己的项目中。然后确保没有项目引用测试项目。

不要方面,客户端库将包含 NUnit dll,因为它们已添加到客户端库引用的项目中。

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

【讨论】:

感谢您的分解和解释——我通过像您和其他用户建议的那样拆分我的项目来实施这种做法。这感觉比我以前做的要好得多,而且我的问题也得到了解决。

以上是关于我可以在安装 NuGet 包时添加这些 .dll 吗?的主要内容,如果未能解决你的问题,请参考以下文章

导入简单的自定义 NuGet 包时出错:包不支持任何目标框架

从 Nuget 安装添加对 bin 目录的引用

为啥我应该将 NuGet 包 dll 添加到源代码管理?

vs 2017 安装后加载类型库/DLL 时出错

Nuget 和 Team Foundation Server 脱机错误

在 VS 2019 中升级 nuget 包时如何让升级按钮工作?