.net - 如何为 .NET Standard 创建 "NuGet Package Management Project"?

标签 .net visual-studio-2017 nuget .net-standard

我想要处理一个唯一要点是引用 NuGet 包的项目,然后 Visual Studio 将下载并更新该包(及其所有依赖项)(目前对我来说是 2017 年)。1 (这有点类似于 another question 中的描述。)

当我创建 .NET Framework 4.7.1 项目时,我可以使用 VS 的“管理 NuGet 包”功能来选择所需的包,VS 会将包下载到解决方案目录中,并下载我的构建脚本可以根据.csproj中找到的信息找出要复制到我的实际项目文件夹中的DLL文件( <HintPath> 等)。

但是,当我对 .NET Standard 2.0 项目执行相同操作时,VS 将使用新的简化 .csproj格式。它所提到的(显式和传递性)所需的包只是一个 <PackageReference>元素仅包含我明确选择引用的每个包的包名称和版本。我的脚本不足以将引用移植到目标 .csproj文件。2

在面向 .NET Standard (2.0) 时,是否还有一种通过此类虚拟项目管理 NuGet 包的好方法?

<小时/>

1:造成这种情况的原因包括大量单独的解决方案,其中许多需要相同的包,并且并非所有开发人员都应该自己管理这些包,以及不支持 NuGet 的环境他们自己的(例如Unity游戏引擎,所以a separate project to manage and pull NuGet references is the way to go)。

2:即使 Unity 项目中配置的“API 兼容性级别”是“.NET Standard 2.0”,.csproj Unity 生成的文件将使用“旧式”详细格式(看起来实际上是针对 .NET Framework 4.*),因此需要引用库的显式路径。

最佳答案

正如我在对该问题的评论中提到的,忽略问题脚注,这看起来像是一个通用的 .NET 问题,我希望谷歌会向进行通用搜索的人推荐此页面,而不仅限于 Unity,而且它不会对于阅读该问题的其他人来说,很明显,在他们阅读了问题的大部分内容之前,该问题是针对 Unity 的。因此,我将首先给出通用 .NET 开发的答案。

如果涉及的所有项目都使用PackageReference ,那么不需要做任何特别的事情。只需从新项目模板创建 .NET 标准类库,添加对所需包的包引用,然后从要使用该组 NuGet 包的应用创建对类库的项目引用。

如果您有一个没有任何软件包的非 SDK 样式项目,那么您应该添加 <PackageRestoreStyle>PackageReference</PackageRestoreStyle> 。原因是PackageReference在 NuGet 启动多年后添加到 NuGet,使用包的原始方式是 packages.config 。因此,当项目未选择 PackageReference 时恢复样式,默认为packages.config 。请参阅下一段。

如果您有一个使用 packages.config 的非 SDK 样式项目(或者没有软件包并且没有选择 PackageReference 恢复样式),那么这种方法可能不起作用。构建系统将构建应用程序的程序集,并可能复制 csproj 中直接引用的所有引用。 ,这意味着它将获取您的类库 dll 以及直接引用的任何 nuget 包。但是,由于应用程序 csproj 不知道类库的 NuGet 包,因此不会复制它们。通常,类库引用它使用的包,.NET 构建系统将使用名为 ResolveAssemblyReferences 的东西。查看类库 dll,看看它有哪些依赖项,然后复制这些 dll。但是,在这种情况下,类库项目没有任何编译依赖项,因为它从未使用项目引用的任何 NuGet 包。

这是 NuGet 和 .NET 团队鼓励客户迁移到 PackageReference 的原因之一。有很多问题,比如传递依赖,以及 <HintPath>当项目移动时会变坏,只要您使用的项目类型支持它,效果就会更好。

现在,鉴于问题脚注提到提问者希望为 Unity 项目执行此操作,我将给出一个希望有效的答案。请注意,虽然我在 NuGet 客户端团队工作,但我对 Unity 一无所知,并且今天早上浪费了大约 2 个小时来安装它并尝试了解其功能,结果发现 Unity 似乎不支持 NuGet 或项目完全引用。

所以我的建议是:

使用dotnet publish让 .NET 构建系统将所有相关 dll 复制到一个文件夹中,然后您可以在 Unity 项目中引用

多目标类库以同时面向 .NET Standard 2.0 和 .NET Framework 4.7.1(调整 .NET Framework 版本以使用与 Unity 项目使用的版本相同的版本)。通过更改 <TargetFramework>netstandard2.0</TargetFramework> 来完成此操作至<TargetFrameworks>netstandard2.0;net471</TargetFrameworks> (请注意,XML 元素末尾添加了 s)。现在,当您构建类库时,.NET SDK 将在 bin\ 中创建两个目录。目录,每个目标框架一个。至少目前看来,net471目录获取所有dll,类似于非SDK风格的项目。

关于.net - 如何为 .NET Standard 创建 "NuGet Package Management Project"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56592020/

相关文章:

c# - 当新版本不存在时使用 <bindingRedirect> 到新版本的程序集

c# - 有没有办法从 Visual Studio Express 生成 DLL 文件而无需显式创建 DLL 项目?

c# - Silverlight Assembly.Load() 仅适用于全名/强名

visual-studio-2017 - 尝试为 VS2019 安装扩展会导致 NullReferenceException

visual-studio - 如何使用 Visual Studio 2017 升级 NuGet?

wpf - Rx-WPF 和 Rx-Xaml 包之间有什么区别吗?

c# - 用于监视多线程 .NET 应用程序的工具、提示和技巧

unit-testing - 如何在VS 2017 .net core项目中生成单元测试用例?

visual-studio-2017 - SQL Server Management Studio 17.9 在使用固定选项卡时崩溃

c# - 从 NuGet 包实现 StyleCop MSBUILD