Supponiamo che io abbia una libreria di classi che voglio indirizzare a netstandard1.3, ma che usi anche BigInteger
. Ecco un esempio banale: l'unico file sorgente è 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);
}
}
Tornando al mondo di project.json
, sceglierei come target netstandard1.3
nella frameworks
sezione e dipenderei esplicitamente System.Runtime.Numerics
, ad esempio dalla versione 4.0.1. Il pacchetto nuget che creo elencherà solo quella dipendenza.
Nel nuovo e coraggioso mondo degli strumenti dotnet basati su csproj (sto usando la v1.0.1 degli strumenti della riga di comando) c'è un riferimento implicito al pacchetto metapacchetto a NETStandard.Library 1.6.1
cui mirare netstandard1.3
. Ciò significa che il mio file di progetto è davvero piccolo, perché non necessita della dipendenza esplicita:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard1.3</TargetFramework>
</PropertyGroup>
</Project>
... ma il pacchetto nuget prodotto ha una dipendenza da NETStandard.Library
, il che suggerisce che per usare la mia piccola libreria, hai bisogno di tutto lì.
Risulta che posso disabilitare quella funzionalità usando DisableImplicitFrameworkReferences
, quindi aggiungere di nuovo manualmente la dipendenza:
<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>
Ora il mio pacchetto NuGet dice esattamente da cosa dipende. Intuitivamente, questo sembra un pacchetto "più snello".
Allora qual è la differenza esatta per un utente della mia libreria? Se qualcuno cerca di usarlo in un'applicazione UWP, la seconda forma di dipendenze "tagliata" significa che l'applicazione risultante sarà più piccola?
Non documentando DisableImplicitFrameworkReferences
chiaramente (per quanto ho visto; ne ho letto in un numero ) e rendendo la dipendenza implicita l'impostazione predefinita durante la creazione di un progetto, Microsoft incoraggia gli utenti a dipendere solo dal metapacchetto, ma come posso esserlo sicuro che non abbia svantaggi quando produco un pacchetto di libreria di classi?
Hello World!
autonoma è ridotta a <10 MB.