我有一个包含多个 .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 配置文件,消费应用程序必须配置包的行为方式,我也在寻求这方面的帮助。
如果您知道要拉动什么杠杆,Visual Studio 会让这种事情变得非常简单。因此,假设出于演示目的,我们制作了一个名为
nuget-dependencies
的控制台应用程序,它恰好使用依赖于 ClassLibA
nuget 的 CommonClassLib
nuget。所以这就是我希望有人告诉我的话,希望它能让事情朝着对你来说正确的方向发展。
这三个 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>
并使用“包源”下拉列表的设置齿轮连接到它。
ClassLibA
和
ClassLibB
彼此一无所知。也就是说,如果您要在项目中同时使用 A 和 B,并且版本不同,那么您可以通过显式引用客户端项目中的通用 NuGet 来解决此问题。 (然而,由于you 是所有三个包的发布者,因此这种情况不像第三方包引用 SQLite 或 JSON 等不同版本的情况那样。)