如何为.NET Standard创建“ NuGet程序包管理项目”?

时间:2019-06-14 05:41:37

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

我想处理一个项目,该项目的唯一要点是引用NuGet程序包,然后(连同其所有依赖项)Visual Studio将下载并更新该程序(当前是2017年)。 1 < / sup>(这有点类似于another question中的描述。)

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

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

在面向.NET Standard(2.0)时,是否仍存在通过这样的虚拟项目管理NuGet软件包的好方法?


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

2 :即使Unity项目中配置的“ API兼容性级别”为“ .NET Standard 2.0”,Unity生成的.csproj文件也将使用“旧样式详细格式(实际上是针对.NET Framework 4. *的),因此期望引用的库有明确的路径。

1 个答案:

答案 0 :(得分:2)

正如我提到的对该问题的评论所述,忽略该问题脚注,这看起来像是一个通用的.NET问题,我希望google会向进行通用搜索的人员(不限于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的功能只是为了发现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样式的项目。