c# - 在项目引用中包含 Nuget 包

标签 c# nuget project-reference

我尝试寻找这个问题的答案,但我发现的所有内容都是指构建我自己的 Nuget 包。需要明确的是,我不想创建 Nuget 包,我只是想引用同一解决方案中的项目。

假设我有两个项目,ProjA 和 ProjB。 ProjB 是一个常见类和方法的库,并具有许多 Nuget 包引用和 .NET 引用(例如 System、System.Printing 等)。

如果我将 ProjB 的项目引用添加到 ProjA,我可以让 ProjB 构建其 DLL,以便它将包含 ProjB 中定义的所有引用。我试图避免将 ProjB 引用的所有 Nuget 包添加到 ProjA 的需要。例如,ProjB 包含一个使用 log4net Nuget 包进行日志记录的类。我不想将其添加到 ProjA 以使构建正常工作。

此外,在解决方案资源管理器的 Refences 文件夹中查看 Nuget 包时,是否应该有 Nuget 包的一些属性?在我的项目中,没有 Nuget 包的属性。

enter image description here

最佳答案

您所要求的被称为“传递包”。如果 ProjB 使用 PackageReference,那么它会自动获取 ProjA 的所有包作为传递包。但是,如果 ProjB 未使用 PackageReference,则 NuGet 不支持传递包。

如果 ProjB 已使用 packages.config 安装了软件包,则必须将项目迁移到 PackageReference。对于许多项目类型,如类库、控制台应用程序、WPF 项目等,通常没有问题,但存在一些包兼容性差异,并且某些项目类型根本不支持 PackageReference,因此这可能不是微不足道的切换:https://learn.microsoft.com/nuget/consume-packages/migrate-packages-config-to-package-reference

否则,这意味着 ProjB 没有直接引用任何包,在这种情况下有 3 个选项:

推荐:使用SDK样式项目

所有 SDK 样式仅是 PackageReference,不支持packages.config。

理解目标框架和项目格式并不是一件小事,我猜为了减少困惑,Visual Studio 的决策者决定将非 SDK 风格的项目模板称为“.NET Framework”,而将 SDK 风格的项目称为“.NET Framework”模板“.NET”(以前是 .NET Core)。但是,SDK 样式项目可以针对 .NET Framework,如果您这样做,您可以从 dotnet 中的所有较新工具中受益。 CLI。

在 Visual Studio 中,创建面向 .NET Framework 的 SDK 样式项目的最简单方法是创建一个新的 .NET 项目,然后编辑项目文件。对于 SDK 样式项目,您不再需要卸载项目,右键单击项目并选择“编辑项目”,或者只需在“解决方案资源管理器”中单击左键即可在代码窗口中打开项目 XML。更改<TargetFramework>net6.0</TargetFramework><TargetFramework>net48</TargetFramework> .

一个最小的 SDK ClassLibrary 项目如下:

<Project>
  <PropertyGroup>
    <TargetFramework>net48</TargetFramework>
  </PropertyGroup>
</Project>

要使其成为控制台应用程序,请添加 <OutputType>exe</OutputType>里面PropertyGroup .

SDK 样式项目自动“glob”**/*.cs ,因此项目不再需要单独列出项目中的每个文件,如您在非 SDK 样式项目中看到的那样。

替代方案 1:使用 PackageReference 安装软件包

安装包,任何包,并确保它使用PackageReference(在安装包之前,工具->选项,NuGet包管理器->常规中有两个选择。我喜欢启用“首次安装包时提示”) 。如果您的项目处于源代码管理中,请考虑为您的存储库位置安装适当的 SourceLink。例如,Microsoft.SourceLink.GitHub。要自动对存储库中的所有项目执行此操作,请创建 Directory.Build.props在您的存储库根目录中,如果您还没有,请将其作为其内容:

<Project>
  <ItemGroup Condition=" '$(MSBuildProjectExtension)' == '.csproj' ">
    <PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.1.1" PrivateAssets="all" />
  </ItemGroup>
</Project>

这样,存储库中的每个 csproj 都将包含此 PackageReference,因此 NuGet 将传递所有 ProjectReference s。

替代方案 2:明确告诉 NuGet 使用哪种恢复样式。

如果您的项目是某些不支持 SDK 样式的项目类型,例如 UWP 项目、Visual Studio Extension (VSIX) 项目或 .NET Framework ASP.NET 项目(请记住,PackageReference 不支持content 像packages.config 那样的包中的文件,因此 PackageReference 将需要对这些类型的项目进行重大迁移),然后添加 MSBuild 属性 <RestoreProjectStyle>PackageReference</RestoreProjectStyle>将工作。如果您不想在所有项目文件上手动执行此操作,请创建 Directory.Build.props存储库根目录中的文件内容如下:

<Project>
  <PropertyGroup Condition=" '$(MSBuildProjectExtension)' == '.csproj' ">
    <RestoreProjectStyle>PackageReference</RestoreProjectStyle>
  <PropertyGroup>
</Project>

请注意,如果存储库中有任何使用packages.config 的项目,这将导致NuGet 停止使用packages.config 文件。由于 MSBuild 是一种编程语言,因此有多种方法可以解决此问题。例如,通过设置 <RestoreProjectStyle>PackagesConfig</RestoreProjectStyle>在您的项目文件中,这将覆盖从 Directory.Build.props 继承的值.

关于c# - 在项目引用中包含 Nuget 包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76129729/

相关文章:

使用 RDP 的 C# 远程桌面应用程序。如何生成证书?

visual-studio - 卸载使用 nuget.exe 安装的 nuget 软件包

visual-studio-2010 - 在 Visual Studio 中导出模板时如何添加相同解决方案项目引用?

.net - 交叉引用程序集

c# - 为什么 var 是坏事?

c# - 脚本任务失败,没有进入Try&Catch block

c# - 新的C#异步功能的一个很好的非联网示例是什么?

c# - 为什么 PCL NuGet 包无法定位 Xamarin 平台?

c# - Entity Framework 数据库第一代崩溃MYSQL

visual-studio-2010 - Visual Studio 2010 中的项目构建顺序?