Was sind die Anwendung, die Auswirkungen einer netstandard Bibliothek je ein Metapaket?
Angenommen ich habe eine Klassenbibliothek, die ich möchte Ziel netstandard1.3, aber auch BigInteger
. Hier ist ein triviales Beispiel - die einzige Quelle die Datei 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 die Welt der project.json
würde ich den Gegner netstandard1.3
im frameworks
Abschnitt, und haben eine explizite Abhängigkeit von System.Runtime.Numerics
, z.B. version 4.0.1. Das nuget-Paket erstelle ich eine Liste nur, die Abhängigkeit.
In die schöne neue Welt der csproj-basierte dotnet-Werkzeuge (ich bin mit v1.0.1 des Kommandozeilen-tools) gibt es eine implizite Metapaket-Paket reference zu NETStandard.Library 1.6.1
bei der Ausrichtung netstandard1.3
. Dies bedeutet, dass meine Projekt-Datei ist wirklich klein, denn es muss nicht die explizite Abhängigkeit:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard1.3</TargetFramework>
</PropertyGroup>
</Project>
... aber das nuget-Paket erzeugt eine Abhängigkeit von NETStandard.Library
, was darauf schließen lässt, dass, um, um meine kleine Bibliothek, die Sie brauchen alles es.
Es stellt sich heraus, ich kann es deaktivieren, die Funktionalität mit DisableImplicitFrameworkReferences
ist, dann fügen Sie in die Abhängigkeit manuell wieder:
<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>
Nun mein NuGet-Paket genau das sagt, was es abhängt. Intuitiv, das fühlt sich an wie ein "schlanker" - Paket.
Also, was ist der genaue Unterschied für einen Verbraucher, der meine Bibliothek? Wenn jemand versucht, es zu benutzen in einem UWP-Anwendung, nicht die zweite, "getrimmt" form von Abhängigkeiten bedeutet, dass die resultierende Anwendung wird kleiner sein?
Durch nicht dokumentieren DisableImplicitFrameworkReferences
klar (soweit ich das gesehen habe; ich habe darüber gelesen,in einer Ausgabe) und durch die implizite Abhängigkeit der standardmäßig beim erstellen eines Projekts in Microsoft sind Förderung Benutzer nur hängt von der Metapaket installieren - aber wie kann ich sicher sein, dass keine Nachteile haben, wenn ich Herstellung eine Bibliothek-Klasse, Paket?
- Es sollte angemerkt werden, dass die Abhängigkeit trimmen gearbeitet. Derzeit ist die Größe eines
Hello World!
eigenständige Anwendung ist reduziert auf < 10 MB. - 10MB ist immer noch viel zu viel im Vergleich zu den < 20KB Größe eines klassischen .NET Framework C# Hallo-Welt-Projekt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
In der Vergangenheit haben wir Entwicklern die Empfehlung, nicht auf die meta -
Paket (
NETStandard.Library
) von NuGet-Pakete, aber anstatt Referenzeinzelne Pakete, wie
System.Runtime
undSystem.Collections
. DieBegründung war, dass wir dachten, der meta-Paket als Sammelbegriff für eine Reihe von
Pakete, waren die eigentlichen atomaren Bausteine der .NET-Plattform. Die
Annahme war: könnten wir am Ende die Schaffung eines anderen .NET-Plattform, die nur
unterstützt einige dieser atomaren Blöcke, aber nicht alle von Ihnen. Daher, je weniger Pakete Sie Referenz, die mehr tragbar Sie sein würden. Es wurden auch Bedenken bezüglich, wie unsere Werkzeuge Angebote mit groß Paket Graphen.
Voran, wir werden vereinfachen:
.NET Standard ist eine Atomare Baustein. In anderen Worten, neue Plattformen
dürfen nicht Teilmenge .NET-Standard-Sie implementieren müssen, um alles.
Wir bewegen uns Weg von der Verwendung von Paketen um zu beschreiben, unsere Plattformen,
inkl .NET Standard.
Bedeutet dies, werden Sie nicht haben, um auf eine NuGet-Pakete für .NET Standard
mehr. Sie äußerte Ihre Abhängigkeit von den mit den lib Ordner, das ist genau, wie
es hat arbeiteten für alle anderen .NET-Plattformen, insbesondere .NET Framework.
Aber jetzt unsere Werkzeuge werden immer noch brennen in der Referenz zu
NETStandard.Library
. Es ist nicht schlimm, dass entweder, es wird nur gewordenredundante voran.
Ich werde aktualisieren, die FAQ auf die .NET-Standard-repo zu dieser Frage.
Update: Diese Frage ist jetzt Teil der FAQ.
Sich das team zu empfehlen, herauszufinden, was die flachste Paket gesetzt wurde. Sie nicht mehr dies tun, und empfehlen, die Menschen bringen Sie nur in NETStandard.Bibliothek statt (im Falle von SDK-Stil Projekt, wird dies automatisch für Sie erledigt).
Habe ich nie bekommen ein völlig straight forward Antwort auf die Frage, warum das war, so erlauben Sie mir einige Vermutungen.
Der Hauptgrund ist wahrscheinlich, dass es Ihnen ermöglicht, diese zu verstecken, die Unterschiede in den Versionen der abhängigen Bibliotheken, die Sie sonst benötigt, um zu verfolgen, sich selbst beim verändern target frameworks. Es ist auch eine viel mehr benutzerfreundliche system mit dem SDK-basierte Projekt-Dateien, weil Sie ehrlich gesagt brauchen keine Referenzen um ein ordentliches Stück von der Plattform (wie Sie verwendet, um mit dem Standard-Referenzen in Desktop-land, insbesondere mscorlib).
Durch das drücken der meta-definition von was es bedeutet, ein
netstandard
Bibliothek oder einenetcoreapp
Anwendung in den entsprechenden NuGet-Pakets, das Sie nicht haben, um zu bauen ohne Besondere Kenntnisse in der definition dieser Dinge wie Visual Studio (oderdotnet new
) sieht.Statische Analyse verwendet werden könnten, die während der Veröffentlichung zu begrenzen, werden die mitgelieferten DLLs, das ist etwas, was Sie heute tun, wenn dabei die native Kompilierung für UWP (wenn auch mit einigen Einschränkungen). Sie tun das nicht, heute für .NET-Core, aber ich vermute, es ist eine Optimierung, die Sie betrachtet habe (wie auch die Unterstützung von native code).
Es hindert Sie nichts daran, dass Sie sehr selektiv, wenn Sie so wählen. Ich glaube, du wirst finden, dass du bist fast der einzige der dies tut, auch die Niederlagen der Zweck (da es werde davon ausgegangen werden, jeder bringt in
NETStandard.Library
oderMicrosoft.NETCore.App
).NETStandard.Library
. Es ist etwas selbst zu erfüllen, natürlich... wenn ich hängtNETStandard.Library
für Noda-Zeit, das bedeutet andere Bibliothek baut auf der Noda-Zeit hat keinen Grund zu trimmen, Abhängigkeiten, etc. Es ist verlockend, wählerisch zu sein, jetzt (Noda Time ist in Richtung 2.0), dann entspannen Sie sich ein wenig später auf einmal Konventionen etabliert haben - Wechsel von selektiven zu lib-basiert, wäre ein non-breaking ändern, nehme ich an, aber das Gegenteil ist nicht wahr.Sollten Sie nicht brauchen, deaktivieren Sie die implizite Referenz. Alle Plattformen, die Bibliothek wird in der Lage sein zu laufen, wird bereits die Assemblys, die
NETStandard.Library
Abhängigkeit erfordern würde.Den .NET Standard Library) ist eine Spezifikation, die einen Satz von Referenz-Assemblys, die Sie kompilieren vor, das eine Reihe von APIs, die garantiert sind, bestehen auf einer Reihe von Plattformen und Versionen-Plattformen, wie .NET Core oder die .NET-Framework. Es ist nicht eine Implementierung dieser Versammlungen, die gerade genug von der API-Form, damit der compiler erfolgreich bauen Sie Ihre code.
Die Umsetzung für diese APIs werden von einer Ziel-Plattform, wie .NET-Core, Mono-oder .NET-Framework. Sie liefern mit der Plattform, denn Sie sind ein wesentlicher Bestandteil der Plattform. So gibt es keine Notwendigkeit, geben Sie eine kleinere Abhängigkeit gesetzt - alles ist schon da, werde Sie nicht ändern.
Den
NETStandard.Library
- Paket bietet diese Referenz Baugruppen. Ein Punkt der Verwirrung ist die Versionsnummer - das Paket ist version 1.6.1, aber das bedeutet nicht, dass ".NET Standard 1.6". Es ist nur die version des Pakets.Die version von der .NET-Standard-Sie ' re-targeting kommt aus dem Ziel-framework geben Sie in Ihrem Projekt.
Wenn Sie eine Bibliothek an und möchte es weiter ausführen .NET-Standard 1.3, solltest du die Referenz
NETStandard.Library
Paket, derzeit version 1.6.1. Aber noch wichtiger ist, Ihre Projekt-Datei mit der Ziel -netstandard1.3
.Den
NETStandard.Library
Paket geben Sie einen anderen Satz von Referenz-Baugruppen je nach Ziel-framework-moniker (ich bin Vereinfachung für die Kürze, aber denkelib\netstandard1.0
,lib\netstandard1.1
und Abhängigkeit von Gruppen). Also, wenn Sie Ihre Projekt-Zielenetstandard1.3
erhalten Sie die 1.3 reference assemblies. Wenn Sie als Zielnetstandard1.6
kriegt man den 1.6 reference assemblies.Wenn Sie erstellen eine Anwendung, die Sie kann nicht als Ziel der .NET Standard. Es macht keinen Sinn - Sie kann nicht laufen, die auf eine Spezifikation. Stattdessen Zielen Sie konkrete Plattformen, wie
net452
odernetcoreapp1.1
. NuGet kennt die Zuordnung zwischen diesen Plattformen und dienetstandard
Ziel-framework-moniker, so weiß dielib\netstandardX.X
Ordner sind kompatibel mit der Zielplattform. Es weiß auch, dass die Abhängigkeiten vonNETStandard.Library
zufrieden sind, die von der Zielplattform, also nicht ziehen in andere Baugruppen.Ähnlich wie beim erstellen eines standalone .NET-Core-app .NET-Standard-Implementierung Baugruppen kopiert mit der app. Der Verweis auf
NETStandard.Library
bringt nicht in jedem anderen neuen apps.Der einzige Ort, den ich mir vorstellen kann, wo es könnte helfen, entfernen Sie die
NETStandard.Library
Referenz ist, wenn Sie auf einer Plattform nicht unterstützt die .NET Standard, und Sie können finden, ein Paket von der .NET Standard, wo alle transitiven Abhängigkeiten kann die Ausführung auf der Zielplattform. Ich vermute, es gibt nicht viele Pakete, die würde passen, dass bill.dotnet publish
zu einer bestimmten Laufzeit, es werden alle Abhängigkeiten, einschließlich dotnet.exe (oder Ihr Linux - /OS X-äquivalent). Das sollte eine völlig eigenständige Bereitstellung an diesem Punkt. Schauen Sie sich die Ergebnisse für einen unit-test-Projekt: gist.github.com/bradwilson/6cc5a8fdfa18230aa6c99b851fb85c01BigInteger
, aber das ist nicht Teil der netstandard1.3. Was passiert - entweder in der Verpackung - Szenario- wenn das ist verwendet als Teil einer Anwendung, welche Ziele sich eine Plattform, die nur unterstützt netstandard1.3 und früher? Vermutlich, dass die Plattform nichtSystem.Runtime.Numerics
, also eine Abhängigkeit, die in der Anwendung Paket. Wenn ich hing aufNETStandard.Library
, wie Sie ist, die Abhängigkeit gezogen, andere aber nicht? Oder würde es überhaupt nicht funktionieren?