1. ホーム
  2. nuget

[解決済み] メタパッケージに依存するネットスタンダードライブラリのアプリケーションへの影響とは?

2023-01-03 11:28:34

質問

netstandard1.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 の世界に戻ると、私なら netstandard1.3 の中に frameworks セクションで、明示的に System.Runtime.Numerics に明示的な依存関係があります(例:バージョン4.0.1)。私が作成するnugetパッケージは、その依存関係だけをリストアップします。

csproj ベースの dotnet ツール (私はコマンドライン ツールの v1.0.1 を使用しています) のすばらしい新世界には 暗黙のメタパッケージパッケージ参照 への NETStandard.Library 1.6.1 をターゲットとする場合 netstandard1.3 . これは、明示的な依存関係が必要ないため、私のプロジェクトファイルが本当に小さくなることを意味します。

<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 アプリケーションでそれを使用しようとした場合、依存関係の 2 番目の、"trimed" 形式は、結果として生じるアプリケーションがより小さくなることを意味しますか?

ドキュメント化しないことで DisableImplicitFrameworkReferences を明確にしないことで、(私が見た限りでは。 を発行しています。 で読みました)、プロジェクトを作成するときに暗黙の依存関係をデフォルトにすることで、Microsoft は を奨励しています。 しかし、クラス ライブラリ パッケージを作成しているときに、それが不利にならないことをどのようにして確認できますか?

どのように解決するのですか?

過去に、私たちは開発者にメタ パッケージ ( NETStandard.Library ) を参照するのではなく、NuGet パッケージから のような個々のパッケージを参照することを推奨してきました。 System.RuntimeSystem.Collections . その理由は その根拠は、メタ パッケージを、.NET プラットフォームの実際の原子構成要素であるパッケージの束の略記法と考えていたためです。 パッケージの略語と考えたからです。その理由は 前提は、これらの原子ブロックの一部だけをサポートし、すべてをサポートしない別の.NETプラットフォームを作成することになるかもしれないということです。 これらの原子ブロックの一部だけをサポートし、すべてをサポートしない別の.NETプラットフォームを作成することになるかもしれない、ということです。ですから、参照するパッケージの数が少なければ少ないほど、移植性は高くなります。また、私たちのツールが大規模なパッケージ グラフをどのように扱うかに関する懸念もありました。

今後、私たちはこれを簡略化します。

  1. .NET Standardは原子的なビルディングブロックである . 言い換えれば、新しいプラットフォームは は .NET 標準をサブセットすることは許されず、そのすべてを実装しなければなりません。

  2. 私たちは、プラットフォームを記述するためにパッケージを使用することから脱却しつつあります。 , .NET Standard も含めてです。

これは、.NET Standard 用の NuGet パッケージを参照する必要がないことを意味します。 を参照する必要がないことを意味します。lib フォルダーで依存関係を表現します。 これは、他のすべての .NET プラットフォーム、特に .NET Framework で機能してきた方法とまったく同じです。

しかし、今現在、私たちのツールはまだ NETStandard.Library . そのことに害はありません。 冗長になるだけです。

を更新して FAQ を更新して、この質問を含めるようにします。

更新 : この質問は現在 FAQの一部です。 .