我首先通读了与我类似的建议问题,但没有解决方案: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-issueTargetProject
(要安装该软件包的项目)-https://github.com/harbourc/target-project-repro-nuget-issue
您可以克隆两个存储库,还原它们的NuGet包,并按以下步骤重现该问题:
Install-Package C:\Path\To\client-library-repro-nuget-issue\ClientLibrary\ClientLibrary.1.0.0.nupkg
NUnit
中的NUnit3TestAdapter
和.dll
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
时,以下.dll
会添加到TargetProject
中:nunit.engine.api.dll
nunit.engine.dll
NUnit3.TestAdapter.dll
NUnit3.TestAdapter.pdb
如果删除这些
.dll
,则一切正常,因为TargetProject
已经安装了那些软件包。它们不是必需的,在安装时必须删除它们只是很烦人。这是我将
ClientLibrary
NuGet包添加到TargetProject
的方法:ClientLibrary
和MainFramework
项目以生成其.dlls 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
上都安装了其他软件包,并且这些软件包没有在安装时添加到.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和依赖项的工作方式,并理解为什么这一直是问题所在。第一名。感谢您的阅读。
最佳答案
通常,最佳做法是将所有测试和相应的NuGet包保留在自己的项目中。然后,确保没有任何项目引用测试项目。
在而非方面,客户端库将包含NUnit dll,因为它们已添加到客户端库引用的项目中。
而在和方面,客户端库将不包含NUnit dll,因为两者均未引用测试项目。