我可以在安装 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 包,每次安装它时,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.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
项目以生成它们的 .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
。感谢您的分析。
【参考方案1】:
一般来说,最好将所有测试和相应的 NuGet 包保存在自己的项目中。然后确保没有项目引用测试项目。
在不要方面,客户端库将包含 NUnit dll,因为它们已添加到客户端库引用的项目中。
而在 do 方面,客户端库将不包含 NUnit dll,因为它们都不会引用测试项目。
【讨论】:
感谢您的分解和解释——我通过像您和其他用户建议的那样拆分我的项目来实施这种做法。这感觉比我以前做的要好得多,而且我的问题也得到了解决。以上是关于我可以在安装 NuGet 包时添加这些 .dll 吗?的主要内容,如果未能解决你的问题,请参考以下文章
导入简单的自定义 NuGet 包时出错:包不支持任何目标框架