假设我有一个类库,我想以 netstandard 1.3为目标,但也使用 BigInteger
。下面是一个简单的例子——唯一的源文件是 Adder.cs
:
using System;
using System.Numerics;
namespace Calculator
{
public class Adder
{
public static BigInteger Add(int x, int y)
=> new BigInteger(x) + new BigInteger(y);
}
}
回到 project.json
的世界,我将在 frameworks
部分中以 netstandard1.3
为目标,并明确依赖于 System.Runtime.Numerics
,例如4.0.1版本。我创建的 nuget 包将只列出这个依赖项。
在基于 csproj 的 dotnet 工具(我使用的是命令行工具的 v1.0.1版本)的全新世界中,当瞄准 netstandard1.3
时,有一个 隐式元包包引用到 NETStandard.Library 1.6.1
。这意味着我的项目文件非常小,因为它不需要明确的依赖关系:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard1.3</TargetFramework>
</PropertyGroup>
</Project>
... 但是生产的 Nuget 软件包依赖于 NETStandard.Library
,这表明为了使用我的小库,你需要 一切在那里。
原来我可以使用 DisableImplicitFrameworkReferences
禁用这个功能,然后再次手动添加依赖项:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard1.3</TargetFramework>
<DisableImplicitFrameworkReferences>true</DisableImplicitFrameworkReferences>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="System.Runtime.Numerics" Version="4.0.1" />
</ItemGroup>
</Project>
现在我的 NuGet 软件包说明了它所依赖的东西。
那么对于我的图书馆的消费者来说,到底有什么不同呢?如果有人试图在 UWP 应用程序中使用它,那么第二种“修剪过的”依赖形式是否意味着最终的应用程序将变得更小?
通过没有清楚地记录 DisableImplicitFrameworkReferences
(就我所见,我读过关于它的 在一期杂志上) ,以及在创建项目时默认使用隐式依赖,微软是仅仅依赖于元包的 鼓舞人心用户——但是我怎么能确定在我创建类库包时这不会有缺点呢?