次の方法で共有


MSBuild を使用して NuGet パッケージを作成する

コードから NuGet パッケージを作成するときは、その機能を、他の任意の数の開発者と共有して使用できるコンポーネントにパッケージ化します。 この記事では、MSBuild を使用してパッケージを作成する方法について説明します。 MSBuild には、NuGet を含むすべての Visual Studio ワークロードがプレインストールされています。 また、dotnet CLI と dotnet msbuild を使用して MSBuild を使用することもできます。

SDK スタイルの形式を使用する .NET Core および .NET Standard プロジェクト、およびその他の SDK スタイルのプロジェクトの場合、NuGet はプロジェクト ファイル内の情報を直接使用してパッケージを作成します。 <PackageReference>を使用する SDK スタイル以外のプロジェクトの場合、NuGet はプロジェクト ファイルを使用してパッケージを作成します。

SDK スタイルのプロジェクトでは、既定でパック機能を使用できます。 SDK スタイル以外の PackageReference プロジェクトの場合、既定では Visual Studio 2026 以降でも使用できます。 以前のバージョンの Visual Studio では、NuGet.Build.Tasks.Pack パッケージをプロジェクトの依存関係に追加する必要があり、Visual Studio 2026 にアップグレードするときにこのパッケージ参照を削除することをお勧めします。 MSBuild パック ターゲットの詳細については、「 NuGet パックと MSBuild ターゲットとしての復元」を参照してください。

SDK スタイルのプロジェクトの場合、 msbuild -t:pack は機能的には dotnet packと同等です。

Important

このトピックは、 SDK スタイルの プロジェクト (通常は .NET Core および .NET Standard プロジェクト)、および PackageReference を使用する SDK スタイル以外のプロジェクトに適用されます。

プロパティの設定

パッケージを作成するには、次のプロパティが必要です。

  • PackageId: パッケージ識別子。パッケージをホストするギャラリー全体で一意である必要があります。 指定しない場合は、既定値の AssemblyName が使用されます。
  • Version: Major.Minor.Patch[-Suffix] という形式の特定のバージョン番号。 -Suffixプレリリース バージョンを識別します。 指定しない場合、既定値は 1.0.0 です。
  • ホストに表示されるパッケージ タイトル (nuget.org など)
  • Authors、作成者と所有者の情報。 指定しない場合は、既定値の AssemblyName が使用されます。
  • Company、自社の名前。 指定しない場合は、既定値の AssemblyName が使用されます。

さらに、PackageReference を使用する SDK スタイル以外のプロジェクトをパッキングする場合は、次のものが必要です。

  • PackageOutputPath: パックの呼び出し時に生成されるパッケージの出力フォルダー。

Visual Studio では、プロジェクトのプロパティでこれらの値を設定できます (ソリューション エクスプローラーでプロジェクトを右クリックし、[ プロパティ] を選択し、[ パッケージ ] タブを選択します)。 これらのプロパティは、プロジェクト ファイル (.csproj) で直接設定することもできます。

<PropertyGroup>
  <PackageId>ClassLibDotNetStandard</PackageId>
  <Version>1.0.0</Version>
  <Authors>your_name</Authors>
  <Company>your_company</Company>
</PropertyGroup>

Important

nuget.org または使用しているパッケージ ソース全体で一意の識別子をパッケージに付与します。

次の例は、これらのプロパティを含むシンプルで完全なプロジェクト ファイルを示しています。

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
    <PackageId>ClassLibDotNetStandard</PackageId>
    <Version>1.0.0</Version>
    <Authors>your_name</Authors>
    <Company>your_company</Company>
  </PropertyGroup>
</Project>

TitlePackageDescriptionPackageTags プロパティの説明に従って、などの省略可能なプロパティを設定することもできます。

一般に使用するために構築されたパッケージの場合は、 PackageTags プロパティに特別な注意を払ってください。タグは、他のユーザーがパッケージを見つけて、パッケージの動作を理解するのに役立つためです。

依存関係の宣言とバージョン番号の指定の詳細については、 プロジェクト ファイルのパッケージ参照パッケージのバージョン管理に関するページを参照してください。 <IncludeAssets>属性と<ExcludeAssets>属性を使用して、パッケージ内の依存関係からアセットを直接表示することもできます。 詳細については、 依存関係資産の制御を参照してください。

省略可能な説明フィールドを追加する

パッケージのオプションの説明は、パッケージの [nuget.org] ページの [ README ] タブに表示されます。 この説明は、プロジェクト ファイル内の<Description>または $description内のから取得します。

次の例は、.NET パッケージの Description ファイル内のを示しています。

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <PackageId>Azure.Storage.Blobs</PackageId>
    <Version>12.4.0</Version>
    <PackageTags>Microsoft Azure Storage Blobs;Microsoft;Azure;Blobs;Blob;Storage;StorageScalable</PackageTags>
    <Description>
      This client library enables working with the Microsoft Azure Storage Blob service for storing binary and text data.
      For this release see notes - https://github.com/Azure/azure-sdk-for-net/blob/master/sdk/storage/Azure.Storage.Blobs/README.md and https://github.com/Azure/azure-sdk-for-net/blob/master/sdk/storage/Azure.Storage.Blobs/CHANGELOG.md
      in addition to the breaking changes https://github.com/Azure/azure-sdk-for-net/blob/master/sdk/storage/Azure.Storage.Blobs/BreakingChanges.txt
      Microsoft Azure Storage quickstarts and tutorials - https://learn.microsoft.com/azure/storage/
      Microsoft Azure Storage REST API Reference - https://learn.microsoft.com/rest/api/storageservices/
      REST API Reference for Blob Service - https://learn.microsoft.com/rest/api/storageservices/blob-service-rest-api
    </Description>
  </PropertyGroup>
</Project>

一意のパッケージ識別子を選択し、バージョン番号を設定する

パッケージ識別子とバージョン番号は、パッケージに含まれている正確なコードを一意に識別します。

パッケージ識別子を作成するには、次のベスト プラクティスに従います。

  • 識別子は、nuget.org およびパッケージをホストする他のすべての場所で 一意 である必要があります。 競合を回避するには、識別子の最初の部分として会社名を使用することをお勧めします。

  • ドット表記を使用して、 .NET 名前空間に似た名前付け規則に従います。 たとえば、Contoso.Utility.UsefulStuffContoso-Utility-UsefulStuffではなく、Contoso_Utility_UsefulStuffを使用します。 また、コードで使用される名前空間にパッケージ識別子を一致させる場合は、コンシューマーにも役立ちます。

  • 別のパッケージの使用方法を示すサンプル コードのパッケージを生成する場合は、.Sampleのように識別子にContoso.Utility.UsefulStuff.Sampleを追加します。

    サンプル パッケージは、元のパッケージに依存しています。 サンプル パッケージを作成するときに、<IncludeAssets>値を使用してcontentFilesを追加します。 コンテンツ フォルダーで、\Samples\< などの \Samples\>identifier というフォルダーにサンプル コードを配置します。

パッケージのバージョンを設定するには、次のベスト プラクティスに従います。

  • 一般に、パッケージのバージョンを プロジェクトまたはアセンブリのバージョンと一致するように設定しますが、これは厳密には必要ありません。 パッケージを 1 つのアセンブリに制限する場合、バージョンの照合は簡単です。 NuGet 自体は、アセンブリ バージョンではなく、依存関係を解決するときにパッケージ バージョンを処理します。

  • 標準以外のバージョンスキームを使用する場合は、「パッケージのバージョン管理」で説明されているように、NuGet のバージョン管理規則考慮してください。 NuGet は、主に セマンティック バージョン 2.0.0 に準拠しています。

依存関係の解決の詳細については、「 PackageReference を使用した依存関係の解決」を参照してください。 バージョン管理の理解に役立つ可能性がある情報については、次の一連のブログ記事を参照してください。

パック用のプロジェクトを構成する

SDK スタイルのプロジェクトでは、追加の構成は必要ありません。

SDK スタイル以外のプロジェクトでは、少なくとも 1 つのパッケージが (packages.configではなく PackageReference 経由で) インストールされている必要があります。または、プロジェクトは、 RestoreProjectStyle プロパティを使用してプロジェクトを PackageReference プロジェクトとして扱うように NuGet に明示的に指示する必要があります。

Visual Studio 2022 以前にはパックが組み込まれていないため、NuGet.Build.Tasks.Pack パッケージをインストールする必要もあります。 Visual Studio 2026 以降にアップグレードする場合は、新機能とバグ修正の恩恵を受けるために、パッケージをアンインストールすることをお勧めします。

  1. プロジェクト ファイルを編集します。

    プロジェクトを PackageReference として扱うように NuGet に明示的に指示する場合 (プロジェクトにパッケージがインストールされていない場合)、<PropertyGroup>ステートメントがないConditionを見つけて追加し、次のように追加します。

    <PropertyGroup>
      <!-- other properties -->
      <RestoreProjectStyle>PackageReference</RestoreProjectStyle>
      <!-- more properties are allowed -->
    </PropertyGroup>
    

    Visual Studio 2022 以前を使用している場合は、 <PropertyGroup> 要素の後に次のコードを追加します。

    <ItemGroup>
      <!-- ... -->
      <PackageReference Include="NuGet.Build.Tasks.Pack" Version="6.14.0" PrivateAssets="all" />
      <!-- ... -->
    </ItemGroup>
    
  2. 開発者コマンド プロンプトを開きます ( [検索 ] ボックスに「 Developer コマンド プロンプト」と入力します)。

    通常は、[スタート] メニューから Visual Studio の開発者コマンド プロンプトを 起動 します。これは、MSBuild に必要なすべてのパスで構成されるためです。

  3. プロジェクト ファイルを含むフォルダーに切り替え、次のコマンドを入力して NuGet.Build.Tasks.Pack パッケージを復元します。

    # Uses the project file in the current folder by default
    msbuild -t:restore
    

    ビルドが正常に完了したことが MSBuild 出力に示されていることを確認します。

msbuild -t:pack コマンドを実行する

プロジェクトから NuGet パッケージ ( .nupkg ファイル) をビルドするには、 msbuild -t:pack コマンドを実行します。また、プロジェクトも自動的にビルドされます。

Visual Studio の開発者コマンド プロンプトで、次のコマンドを入力します。

# Uses the project file in the current folder by default
msbuild -t:pack

出力には、 .nupkg ファイルへのパスが表示されます。

Microsoft (R) Build Engine version 16.1.76+g14b0a930a7 for .NET Framework
Copyright (C) Microsoft Corporation. All rights reserved.

Build started 8/5/2019 3:09:15 PM.
Project "C:\Users\username\source\repos\ClassLib_DotNetStandard\ClassLib_DotNetStandard.csproj" on node 1 (pack target(s)).
GenerateTargetFrameworkMonikerAttribute:
Skipping target "GenerateTargetFrameworkMonikerAttribute" because all output files are up-to-date with respect to the input files.
CoreCompile:
  ...
CopyFilesToOutputDirectory:
  Copying file from "C:\Users\username\source\repos\ClassLib_DotNetStandard\obj\Debug\netstandard2.0\ClassLib_DotNetStandard.dll" to "C:\Use
  rs\username\source\repos\ClassLib_DotNetStandard\bin\Debug\netstandard2.0\ClassLib_DotNetStandard.dll".
  ClassLib_DotNetStandard -> C:\Users\username\source\repos\ClassLib_DotNetStandard\bin\Debug\netstandard2.0\ClassLib_DotNetStandard.dll
  Copying file from "C:\Users\username\source\repos\ClassLib_DotNetStandard\obj\Debug\netstandard2.0\ClassLib_DotNetStandard.pdb" to "C:\Use
  rs\username\source\repos\ClassLib_DotNetStandard\bin\Debug\netstandard2.0\ClassLib_DotNetStandard.pdb".
GenerateNuspec:
  Successfully created package 'C:\Users\username\source\repos\ClassLib_DotNetStandard\bin\Debug\AppLogger.1.0.0.nupkg'.
Done Building Project "C:\Users\username\source\repos\ClassLib_DotNetStandard\ClassLib_DotNetStandard.csproj" (pack target(s)).

Build succeeded.
    0 Warning(s)
    0 Error(s)

Time Elapsed 00:00:01.21

ビルド時にパッケージを自動的に生成する

プロジェクトをビルドまたは復元するときに msbuild -t:pack を自動的に実行するには、 <PropertyGroup>内のプロジェクト ファイルに次の行を追加します。

<GeneratePackageOnBuild>true</GeneratePackageOnBuild>

ソリューションで msbuild -t:pack を実行すると、パック可能なソリューション内のすべてのプロジェクトがパックされます (<IsPackable> プロパティは true に設定されます)。

パッケージを自動的に生成すると、パックする時間によってプロジェクトのビルド時間が長くなります。

パッケージのインストールをテストする

パッケージを発行する前に、通常はプロジェクトにパッケージをインストールするプロセスをテストする必要があります。 テストでは、必ずしもすべてのファイルがプロジェクト内の正しい場所に配置されることを確認します。

通常の パッケージ インストール手順を使用して、Visual Studio またはコマンド ラインでインストールを手動でテストできます。

Important

パッケージは不変です。 問題を修正する場合は、パッケージの内容を変更し、もう一度パックします。再テストを行うときは、 グローバル パッケージ フォルダーをクリアするまで、古いバージョンのパッケージが引き続き使用されます。 これは、すべてのビルドで一意のプレリリース ラベルを使用しないパッケージをテストする場合に特に関連します。

次のステップ

.nupkg ファイルであるパッケージを作成したら、「パッケージの発行」の説明に従って、選択したギャラリーに発行できます。

次のトピックで説明するように、パッケージの機能を拡張したり、他のシナリオをサポートしたりすることもできます。

最後に、注意する必要がある追加のパッケージの種類があります。