Angenommen, ich habe eine Klassenbibliothek, auf die ich netstandard1.3 abzielen, aber auch verwenden möchte BigInteger
. Hier ist ein triviales Beispiel - die einzige Quelldatei ist 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);
}
}
Zurück in der Welt von project.json
würde ich netstandard1.3
in diesem frameworks
Abschnitt zielen und eine explizite Abhängigkeit von System.Runtime.Numerics
z. B. Version 4.0.1 haben. Das von mir erstellte Nuget-Paket listet nur diese Abhängigkeit auf.
In der schönen neuen Welt der csproj-basierten Dotnet-Tools (ich verwende Version 1.0.1 der Befehlszeilentools) gibt es einen impliziten Metapaket-Paketverweis, auf den NETStandard.Library 1.6.1
beim Targeting verwiesen wirdnetstandard1.3
. Dies bedeutet, dass meine Projektdatei sehr klein ist, da sie keine explizite Abhängigkeit benötigt:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard1.3</TargetFramework>
</PropertyGroup>
</Project>
... aber das produzierte Nuget-Paket hat eine Abhängigkeit von NETStandard.Library
, was darauf hindeutet, dass Sie dort alles benötigen, um meine kleine Bibliothek zu nutzen .
Es stellt sich heraus, dass ich diese Funktionalität mithilfe deaktivieren DisableImplicitFrameworkReferences
und die Abhängigkeit dann manuell wieder hinzufügen kann:
<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>
Jetzt sagt mein NuGet-Paket genau, worauf es ankommt. Intuitiv fühlt sich das wie ein "schlankeres" Paket an.
Was ist der genaue Unterschied für einen Verbraucher meiner Bibliothek? Wenn jemand versucht, es in einer UWP-Anwendung zu verwenden, bedeutet die zweite "getrimmte" Form von Abhängigkeiten, dass die resultierende Anwendung kleiner ist?
Indem Microsoft nicht DisableImplicitFrameworkReferences
klar dokumentiert (soweit ich gesehen habe; ich habe in einem Problem darüber gelesen ) und die implizite Abhängigkeit beim Erstellen eines Projekts als Standard festgelegt hat, ermutigt Microsoft die Benutzer, sich nur auf das Metapaket zu verlassen - aber wie kann ich das sein? Sicher, dass das keine Nachteile hat, wenn ich ein Klassenbibliothekspaket produziere?
Hello World!
in sich geschlossenen Anwendung auf <10 MB reduziert.