多个 NuGet 包在同一解决方案中引用公共类库

问题描述 投票:0回答:1

我有一个包含多个 .NET Standard 2.0 C# 类库项目的 Visual Studio 解决方案:

MainSolution
---- ClassLibA
---- ClassLibB
---- CommonClassLib

ClassLibA
ClassLibB
都将是 NuGet 包,稍后由其他应用程序使用。
CommonClassLib
是一个通用实用类库,其中包含可供其他类库使用的内容(想想 SOAP 服务包装器的配置类)。我希望能够为
ClassLibA
部署一个 NuGet 包,该包具有
CommonClassLib
中的功能,而无需
ClassLibB
中的任何内容,反之亦然。

我尝试遵循这篇文章,但无济于事:https://dev.to/yerac/include-both-nuget-package-references-and-project-reference-dll-using-dotnet-pack-2d8p。我会收到 SYSLIB1102 错误,并且我完全迷失了,因为我们使用相同的目标框架。

在这种情况下命名空间重要吗?难道是别的什么?任何帮助都会很棒。

为了在一个单独但相关的问题中增加复杂性,我想部署一个带有

CommonClassLib
的 JSON 配置文件,消费应用程序必须配置包的行为方式,我也在寻求这方面的帮助。

c# nuget .net-standard class-library
1个回答
0
投票

如果您知道要拉动什么杠杆,Visual Studio 会让这种事情变得非常简单。因此,假设出于演示目的,我们制作了一个名为

nuget-dependencies
的控制台应用程序,它恰好使用依赖于
ClassLibA
nuget 的
CommonClassLib
nuget。所以这就是我希望有人告诉我的话,希望它能让事情朝着对你来说正确的方向发展。


solution explorer


这三个 NuGet 项目很相似,所以让我们看看下面完整显示的 ClassLibA

csproj
文件。 此标签使其构建到与解决方案相关的临时文件夹中:

<PackageOutputPath>$(SolutionDir)\local-repo</PackageOutputPath>

这会导致它在项目构建时打包 NuGet。

<GeneratePackageOnBuild>True</GeneratePackageOnBuild>

这是对 CommonClassLib“最新发布版本”的浮动引用。

<PackageReference Include="CommonClassLib" Version="*" />


<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <Title>ClassLibA</Title> <Description>Demo Only</Description> <PackageTags>portable;net;android;ios</PackageTags> <RepositoryUrl>https://github.com/IVSoftware/nuget-dependencies</RepositoryUrl> <PackageProjectUrl>https://github.com/IVSoftware/nuget-dependencies</PackageProjectUrl> <TargetFramework>netstandard2.0</TargetFramework> <AssemblyVersion>1.5.0</AssemblyVersion> <GeneratePackageOnBuild>True</GeneratePackageOnBuild> <Authors>IVSoft</Authors> <Owner>IVSoft</Owner> <Copyright>Copyright © 2024 IVSoft</Copyright> <FileVersion>$(AssemblyVersion)</FileVersion> <Version>$(AssemblyVersion)</Version> <PackageReadmeFile>README.md</PackageReadmeFile> <PackageLicenseExpression>MIT</PackageLicenseExpression> <PackageRequireLicenseAcceptance>True</PackageRequireLicenseAcceptance> <!--SignAssembly>True</SignAssembly--> <!--AssemblyOriginatorKeyFile></AssemblyOriginatorKeyFile--> <DebugType>embedded</DebugType> <PackageOutputPath>$(SolutionDir)\local-repo</PackageOutputPath> </PropertyGroup> <ItemGroup> <None Include="..\README.md"> <Pack>True</Pack> <PackagePath>\</PackagePath> </None> </ItemGroup> <ItemGroup> <PackageReference Include="CommonClassLib" Version="*" /> </ItemGroup> </Project>


现在构建并检查 local-repo 文件夹:

local-repo

并使用“包源”下拉列表的设置齿轮连接到它。

local NuGet repo


关于您的问题,我想提出的要点是,当您去管理控制台应用程序的 NuGet 包时,只需要安装 ClassLibA (或 ClassLibB ...),就会选择通用库作为传递参考。

NuGet package manager


正如您所说,

ClassLibA

ClassLibB
彼此一无所知。也就是说,如果您要在项目中同时使用 A 和 B,并且版本不同,那么您可以通过显式引用客户端项目中的通用 NuGet 来解决此问题。 (然而,由于 
you 是所有三个包的发布者,因此这种情况不像第三方包引用 SQLite 或 JSON 等不同版本的情况那样。)

© www.soinside.com 2019 - 2024. All rights reserved.