我正在努力了解依赖关系在.NET Core中是如何工作的。
假设我有两个项目。Project1具有以下定义:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..Project2Project2.csproj" />
</ItemGroup>
</Project>
这个使用Newtonsoft.Json
依赖关系的类:
public class Wizard
{
public void DoMagic()
{
var settings = Newtonsoft.Json.JsonConvert.DefaultSettings;
}
}
正如您所看到的,它还引用了Project2,它有以下定义:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
</ItemGroup>
</Project>
当我从Project1中删除Newtonsoft.Json
包引用时,我希望它不再编译。。。但它确实可以编译!看起来,它可以使用Newtonsoft.Json
,它是Project2的依赖项。
所以我有两个问题:
- 我用一个";内部";为了方便起见,项目引用,但这与外部包引用(即NuGet(的工作方式相同吗
- 有人能解释一下这里的理由吗在我看来,如果我的项目使用的是子依赖项,那么更改项目的任何依赖项中的依赖项都可能破坏我的项目。换句话说,为什么允许这样做隐式使用依赖项的依赖项似乎总是一个坏主意,因为它可能会更改和破坏代码,那么为什么框架允许这样做呢
-
是的,这就是它在所有方面的工作方式。
-
您可以使用
PrivateAssets
来控制:
https://learn.microsoft.com/en-us/nuget/consume-packages/package-references-in-project-files#controlling-依赖资产