【发布时间】:2019-12-12 20:39:52
【问题描述】:
我首先阅读了这个与我类似的建议问题,但没有解决方案:Why does MSTest.TestAdapter adds its DLLs into my NuGet package?
快速问题描述
我编写了一个 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 包,然后重现问题,如下所示:
在 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中的NUnit和NUnit3TestAdapter.dll-- 即使TargetProject已经安装了NUnit和NUnit3TestAdapter。
更长的概述
我已经创建了自己的 NuGet 包供内部使用,名为 ClientLibrary,我正在尝试将其安装到另一个名为 TargetProject 的项目中。以下是结构的快速分解:
-
FullSolution.slnMainFramework.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 的方式:
- 构建
ClientLibrary和MainFramework项目以生成它们的 .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 已安装 NUnit 和 NUnit3TestAdapter NuGet 包。 ClientLibrary 没有。因此,.dll 似乎已添加,因为它们安装在 MainFramework 上,但未安装在 ClientLibrary 上。 (记住,ClientLibrary 引用 MainFramework.dll。)
MainFramework 和 ClientLibrary 上都安装了 other 软件包,这些软件包没有在安装时添加到 TargetProject 的 .dll,所以我假设有问题是由于 MainFramework 中存在包但 ClientLibrary 中不存在包引起的。
我相信我可以通过将NUnit 和NUnit3TestAdapter 安装到ClientLibrary 上来“解决”这个问题,但是ClientLibrary 实际上根本不使用这些包,所以似乎没有必要。
如何在不包括NUnit 和NUnit3TestAdapter .dll 的情况下将ClientLibrary 安装到TargetProject 上,并且不必将NUnit 和NUnit3TestAdapter 安装到ClientLibrary 上?如果可能,我想告诉ClientLibrary.1.0.0.nupkg 使用TargetProject 上已经安装的NUnit 和NUnit3TestAdapter 软件包。
如果答案是“不可能”,那很好,但我想要一个解释——我对这个问题的总体目标是更好地理解 NuGet 和依赖项的工作原理,并理解为什么这是一个问题放在首位。感谢您的阅读。
【问题讨论】:
-
您必须提供示例项目来说明行为。
-
@LexLi 我已经更新了我的项目描述,其中包含两个说明行为的示例存储库以及重现步骤。
-
代码显示了在 MainFramework.csproj 中具有 NUnit 依赖项的错误方法。能否将它们移至单独的单元测试项目,例如 MainFramework.UnitTest.csproj?
-
有道理——
ClientLibrary只使用了MainFramework的一部分,所以MainFramework当然可以拆分为MainFramework.Framework和MainFramework.Test,其中NUnit依赖只存在在MainFramework.Test和ClientLibrary中仅使用MainFramework.Framework。感谢您的分析。