如何在.NET Standard类库中指定依赖项?

10

.NET标准类库不使用.nuspec文件;在项目设置中有一个“包”选项卡,您需要在其中输入NuGet包的所有元数据,这些都在.csproj文件中。

我想创建一个解决方案,其中包含A和B两个项目,其中B项目依赖于A项目。这两个项目都需要作为单独的NuGet包发布。但是,如果有人安装了B的NuGet包,则它也应该安装A的包。

如何为.NET标准类库指定此简单的依赖关系?我并不假设仅添加引用就足以实现此目的。

2个回答

6
NET Standard .csproj文件使用PackageReferenceProjectReference MSBuild项来控制从NuGet或您的解决方案中加载的软件包的依赖关系。它们都支持元数据标签PrivateAssetsIncludeAssetsExcludeAssets,用于控制项目对这些依赖项的依赖关系的具体内容和方式。默认情况下,Visual Studio会自动生成所有依赖项,并使用PrivateAssets,这意味着这些依赖项被消耗,但它们没有被标记为您项目的消费者(即NuGet中的一个包)的依赖项。 因此,您只需将PrivateAssets元数据替换为IncludeAssets(可能是适当的值)即可。 例如,我的SuperPackage.csproj文件如下所示:
..................
  <ItemGroup>
    <PackageReference Include="Microsoft.CodeAnalysis.FxCopAnalyzers" Version="2.6.0">
      <PrivateAssets>all</PrivateAssets>
    </PackageReference>
    <PackageReference Include="Newtonsoft.Json" Version="11.0.2">
      <IncludeAssets>compile</IncludeAssets>
    </PackageReference>
  </ItemGroup>

  <ItemGroup>
    <ProjectReference Include="..\ClassLibrary1\ClassLibrary1.csproj">
      <IncludeAssets>compile</IncludeAssets>
    </ProjectReference>
  </ItemGroup>
</Project>

所以,我已将NuGet中的'Newtonsoft.Json'包标记为依赖项,并将ClassLibrary1项目的ProjectReference添加到单个解决方案中。当使用选中的'生成NuGet包构建'来构建SuperPackage项目时,我会得到以下SuperPackage.nupkg文件:

enter image description here

请查看此文档以获取更多详细信息: https://learn.microsoft.com/en-us/nuget/consume-packages/package-references-in-project-files


这解决了我的问题,但重要的是要在“包”项目属性选项卡中检查“生成NuGet包”。我最初使用命令行中的nuget pack,但.nuspec文件缺少<Dependencies>元素。更改项目设置以在构建时生成包后,此元素将出现在.nuspec文件中。 - Greg Burghardt
如果使用Azure Pipeline创建软件包,我发现您需要使用 dotnet 任务而不是 nuget 任务来处理这些依赖项,以使其包含在nupkg结果中。 - Mike Guthrie

2
根据我所找到的,.csproj 文件尚不支持此功能,您应该使用 .nuspec 来指定依赖项。例如,可以看一下 xUnit 是如何实现的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接