MSBuild ターゲットとしての NuGet pack と restore

NuGet 4.0+

NuGet 4.0 以降では、PackageReference 形式を使用することにより、すべてのマニフェスト メタデータを、個別の .nuspec ファイルを使用せずにプロジェクト ファイルに直接保存できます。

また、MSBuild 15.1 以降では、NuGet は以下のように pack および restore をターゲットとする、MSBuild の最上級のメンバーです。 これらのターゲットでは、他の MSBuild タスクやターゲットの場合と同様に NuGet を使用できます。 MSBuild を使用して NuGet パッケージを作成する手順については、「MSBuild を使用して NuGet パッケージを作成する」を参照してください。 (NuGet 3.x 以前の場合は、NuGet CLI の pack および restore コマンドを使用します)。

ターゲットのビルド順序

packrestore は MSBuild のターゲットなので、アクセスしてワークフローを強化できます。 たとえば、パッケージをパック後にネットワーク共有にコピーするとします。 この場合、プロジェクト ファイルに以下を追加します。

<Target Name="CopyPackage" AfterTargets="Pack">
  <Copy
    SourceFiles="$(OutputPath)..\$(PackageId).$(PackageVersion).nupkg"
    DestinationFolder="\\myshare\packageshare\"
    />
</Target>

同様に、MSBuild タスクを記述し、独自のターゲットを記述して、MSBuild タスクで NuGet プロパティを使用することができます。

Note

$(OutputPath) は相対値であり、プロジェクト ルートからコマンドを実行していることを想定しています。

pack ターゲット

PackageReference 形式を使用する .NET プロジェクトの場合、msbuild -t:pack を使用すると、NuGet パッケージの作成に使用するプロジェクト ファイルからの入力を描画します。

以下の表では、最初の <PropertyGroup> ノード内のプロジェクト ファイルに追加できる MSBuild のプロパティについて説明します。 Visual Studio 2017 以降では、プロジェクトを右クリックし、コンテキスト メニューで [{project_name} の編集] を選択して、この編集を簡単に行うことができます。 便宜上、この表は、.nuspec ファイルの同等のプロパティごとに整理されています。

Note

OwnersSummary および .nuspec プロパティは、MSBuild ではサポートされていない点に注意してください。

属性/nuspec 値 MSBuild プロパティ 既定値 メモ
Id PackageId $(AssemblyName) MSBuild からの $(AssemblyName)
Version PackageVersion バージョン これは、semver と互換性があります (たとえば、1.0.01.0.0-beta1.0.0-beta-00345)。 設定されていない場合、既定値は Version です。
VersionPrefix VersionPrefix empty PackageVersion を設定すると VersionPrefix が上書きされます。
VersionSuffix VersionSuffix empty PackageVersion を設定すると VersionSuffix が上書きされます。
Authors Authors 現在のユーザーのユーザー名 nuget.org 上のプロフィール名と一致するパッケージ作成者のセミコロン区切りのリスト。これらは、nuget.org の NuGett ギャラリーに表示され、同じ作成者によるパッケージの相互参照に使用されます。
Owners 該当なし nuspec にはありません。
Title Title $(PackageId) 人が読みやすいパッケージのタイトル。通常、nuget.org と、Visual Studio のパッケージ マネージャーの UI 画面で使用されます。
Description Description "パッケージの説明" アセンブリの長い説明。 PackageDescription が指定されていない場合、このプロパティはパッケージの説明としても使用されます。
Copyright Copyright empty パッケージの著作権の詳細。
RequireLicenseAcceptance PackageRequireLicenseAcceptance false クライアントがユーザーに対して、パッケージのインストール前にパッケージ ライセンスに同意することを必須にするかどうかを示すブール値。
license PackageLicenseExpression empty <license type="expression"> に相当します。 「ライセンス式またはライセンス ファイルのパッキング」を参照してください。
license PackageLicenseFile empty カスタム ライセンス、または SPDX 識別子が割り当てられていないライセンスを使用している場合、パッケージ内のライセンス ファイルへのパス。 参照されているライセンス ファイルを明示的にパックする必要があります。 <license type="file"> に相当します。 「ライセンス式またはライセンス ファイルのパッキング」を参照してください。
LicenseUrl PackageLicenseUrl empty PackageLicenseUrl は非推奨とされます。 代わりに、PackageLicenseExpression タグまたは PackageLicenseFile タグを使用してください。
ProjectUrl PackageProjectUrl empty
Icon PackageIcon empty パッケージ アイコンとして使用するパッケージ内の画像へのパス。 参照されているアイコン画像ファイルを明示的にパックする必要があります。 詳細については、「アイコン画像ファイルのパッキング」および、「icon メタデータ」を参照してください。
IconUrl PackageIconUrl empty PackageIconUrl は非推奨であり、代わりに PackageIcon を使ってください。 ただし、最適なダウンレベル エクスペリエンスを得るためには、PackageIconUrl に加えて PackageIcon を指定する必要があります。
Readme PackageReadmeFile empty 参照される readme ファイルを明示的にパックする必要があります。
Tags PackageTags empty パッケージを指定するタグのセミコロン区切りの一覧。
ReleaseNotes PackageReleaseNotes empty パッケージのリリース ノート。
Repository/Url RepositoryUrl empty ソース コードの複製または取得に使用されるリポジトリ URL。 例: https://github.com/NuGethttps://github.com/NuGet/NuGet.Client.git
Repository/Type RepositoryType empty リポジトリの種類。 例: git (既定値)、tfs
Repository/Branch RepositoryBranch empty オプションのリポジトリ ブランチ情報。 このプロパティを含めるには、RepositoryUrl も指定する必要があります。 例: master (NuGet 4.7.0 以降)。
Repository/Commit RepositoryCommit empty 任意のリポジトリ コミットまたは変更セット。パッケージがどのソースに対してビルドされたかを示します。 このプロパティを含めるには、RepositoryUrl も指定する必要があります。 例: 0e4d1b598f350b3dc675018d539114d1328189ef (NuGet 4.7.0 以降)。
PackageType <PackageType>CustomType1, 1.0.0.0;CustomType2</PackageType> パッケージの使用目的を示します。 パッケージの種類は、パッケージ ID と同じ形式で、; で区切られます。 パッケージの種類は、, および Version 文字列を追加することによってバージョン管理できます。 「NuGet パッケージ タイプの設定 (NuGet 3.5.0 以降)」を参照してください。
Summary サポートされていません

pack ターゲットの入力

プロパティ 説明
IsPackable プロジェクトをパックできるかどうかを示すブール値。 既定値は true です。
SuppressDependenciesWhenPacking true に設定し、生成された NuGet パッケージからのパッケージ依存関係を抑制します。
PackageVersion 結果のパッケージのバージョンを指定します。 すべてのフォームの NuGet バージョン文字列を受け入れます。 既定値は $(Version) です。つまり、プロジェクトのプロパティ Version の値です。
PackageId 結果のパッケージの名前を指定します。 指定しない場合、pack 操作の既定では、AssemblyName またはディレクトリ名をパッケージ名として使用します。
PackageDescription UI 画面用のパッケージの長い説明。
Authors nuget.org 上のプロフィール名と一致するパッケージ作成者のセミコロン区切りのリスト。これらは、nuget.org の NuGett ギャラリーに表示され、同じ作成者によるパッケージの相互参照に使用されます。
Description アセンブリの長い説明。 PackageDescription が指定されていない場合、このプロパティはパッケージの説明としても使用されます。
Copyright パッケージの著作権の詳細。
PackageRequireLicenseAcceptance クライアントがユーザーに対して、パッケージのインストール前にパッケージ ライセンスに同意することを必須にするかどうかを示すブール値。 既定値は、false です。
DevelopmentDependency 開発専用の依存関係としてパッケージをマークするかどうかを指定するブール値。指定すると、そのパッケージは他のパッケージに依存関係として含まれなくなります。 PackageReference (NuGet 4.8 以降) では、このフラグは、コンパイルからコンパイル時アセットが除外されることも表します。 詳しくは、「DevelopmentDependency support for PackageReference (PackageReference に対する DevelopmentDependency のサポート)」をご覧ください。
PackageLicenseExpression SPDX ライセンス識別子または式 (たとえば Apache-2.0)。 詳しくは、「ライセンス式またはライセンス ファイルのパッキング」を参照してください。
PackageLicenseFile カスタム ライセンス、または SPDX 識別子が割り当てられていないライセンスを使用している場合、パッケージ内のライセンス ファイルへのパス。
PackageLicenseUrl PackageLicenseUrl は非推奨とされます。 代わりに、PackageLicenseExpression タグまたは PackageLicenseFile タグを使用してください。
PackageProjectUrl
PackageIcon パッケージのルートを基準としたパッケージ アイコン パスを指定します。 詳細については、「アイコン画像ファイルをパックする」を参照してください。
PackageReleaseNotes パッケージのリリース ノート。
PackageReadmeFile パッケージの Readme。
PackageTags パッケージを指定するタグのセミコロン区切りの一覧。
PackageOutputPath パックされたパッケージをドロップする出力パスを指定します。 既定値は $(OutputPath) です。
IncludeSymbols このブール値は、プロジェクトをパックするときに、パッケージが追加のシンボル パッケージを作成するかどうかを指定します。 シンボル パッケージの形式は、SymbolPackageFormat プロパティで制御します。 詳細については、「IncludeSymbols」を参照してください。
IncludeSource このブール値は、パック プロセスでソース パッケージを作成するかどうかを示します。 ソース パッケージには、ライブラリのソース コードと PDB ファイルが含まれます。 ソース ファイルは、結果のパッケージ ファイルの src/ProjectName ディレクトリに置かれます。 詳細については、「IncludeSource」を参照してください。
PackageType
IsTool すべての出力ファイルを lib フォルダーではなく tools フォルダーにコピーするかどうかを指定します。 詳細については、「IsTool」を参照してください。
RepositoryUrl ソース コードの複製または取得に使用されるリポジトリ URL。 例: https://github.com/NuGethttps://github.com/NuGet/NuGet.Client.git
RepositoryType リポジトリの種類。 例: git (既定値)、tfs
RepositoryBranch オプションのリポジトリ ブランチ情報。 このプロパティを含めるには、RepositoryUrl も指定する必要があります。 例: master (NuGet 4.7.0 以降)。
RepositoryCommit 任意のリポジトリ コミットまたは変更セット。パッケージがどのソースに対してビルドされたかを示します。 このプロパティを含めるには、RepositoryUrl も指定する必要があります。 例: 0e4d1b598f350b3dc675018d539114d1328189ef (NuGet 4.7.0 以降)。
SymbolPackageFormat シンボル パッケージの形式を指定します。 "symbols.nupkg" の場合、.symbols.nupkg 拡張子と共に、PDB、DLL、およびその他の出力ファイルを含む従来のシンボル パッケージが作成されます。 "snupkg" の場合、ポータブル PDB を含む snupkg シンボル パッケージが作成されます。 既定値は "symbols.nupkg" です。
NoPackageAnalysis パッケージのビルド後に、pack がパッケージの分析を実行しないことを指定します。
MinClientVersion nuget.exe および Visual Studio パッケージ マネージャーで強制する、このパッケージをインストールできる NuGet クライアントの最小バージョンを指定します。
IncludeBuildOutput このブール値は、ビルド出力アセンブリを .nupkg ファイルにパッケージ化するかどうかを指定します。
IncludeContentInPack このブール値は、種類が Content の項目を結果のパッケージに自動的に含めるかどうかを指定します。 既定値は、true です。
BuildOutputTargetFolder 出力アセンブリを配置するフォルダーを指定します。 出力アセンブリ (および他の出力ファイル) は、各フレームワーク フォルダーにコピーされます。 詳しくは、「アセンブリの出力」をご覧ください。
ContentTargetFolders PackagePath が指定されていない場合に、すべてのコンテンツ ファイルを配置する既定の場所を指定します。 既定値は "content;contentFiles" です。 詳細については、「Including content in a package」 (パッケージにコンテンツを追加する) を参照してください。
NuspecFile パックに使用する .nuspec ファイルの相対パスまたは絶対パス。 指定した場合、パッケージ情報にのみ使用され、プロジェクト内の情報は使用されません。 詳細については、「.nuspec を使用したパック操作」を参照してください。
NuspecBasePath .nuspec ファイルのベース パス。 詳細については、「.nuspec を使用したパック操作」を参照してください。
NuspecProperties キー=値ペアのセミコロン区切りの一覧。 詳細については、「.nuspec を使用したパック操作」を参照してください。

pack のシナリオ

依存関係の抑制

生成された NuGet パッケージからのパッケージの依存関係を抑制するには、SuppressDependenciesWhenPackingtrue に設定すると、生成された nupkg ファイルからすべての依存関係をスキップできます。

PackageIconUrl

PackageIcon プロパティが優先され、PackageIconUrl が非推奨になります。 NuGet 5.3 および Visual Studio 2019 バージョン 16.3 以降では、pack では、パッケージ メタデータでPackageIconUrl のみが指定されている場合に NU5048 警告が発生します。

PackageIcon

ヒント

まだサポートPackageIconしていないクライアントとソースとの下位互換性メイン維持するには、両方PackageIconを指定しますPackageIconUrl。 Visual Studio では、 PackageIcon フォルダー ベースのソースからのパッケージに対応する。

アイコン画像ファイルのパッキング

アイコン画像ファイルをパックする場合は、PackageIcon プロパティを使用して、パッケージのルートを基準としたアイコン ファイル パスを指定する必要があります。 さらに、ファイルがパッケージに含まれていることを確認する必要があります。 画像ファイルのサイズは 1 MB に制限されています。 対応しているファイル形式: JPEG、PNG。 画像の解像度は 128 x 128 にすることをお勧めします。

次に例を示します。

<PropertyGroup>
    ...
    <PackageIcon>icon.png</PackageIcon>
    ...
</PropertyGroup>

<ItemGroup>
    ...
    <None Include="images\icon.png" Pack="true" PackagePath="\"/>
    ...
</ItemGroup>

パッケージ アイコンのサンプル

nuspec と同等のものについては、アイコンに関する nuspec リファレンスを参照してください。

PackageReadmeFile

NuGet 5.10.0 preview 2 / .NET SDK 5.0.300 以降でサポートされます

readme ファイルをパックする場合は、PackageReadmeFile プロパティを使用して、パッケージのルートを基準としたパッケージ パスを指定する必要があります。 これに加えて、ファイルがパッケージに含まれていることを確認する必要があります。 対応しているファイル形式には、Markdown (.md) のみが含まれます。

次に例を示します。

<PropertyGroup>
    ...
    <PackageReadmeFile>readme.md</PackageReadmeFile>
    ...
</PropertyGroup>

<ItemGroup>
    ...
    <None Include="docs\readme.md" Pack="true" PackagePath="\"/>
    ...
</ItemGroup>

nuspec と同等のものについては、「readme に関する nuspec リファレンス」を参照してください。

出力アセンブリ

nuget pack は拡張子 .exe.dll.xml.winmd.json、および .pri の出力ファイルをコピーします。 コピーされる出力ファイルは、MSBuild が BuiltOutputProjectGroup ターゲットから提供するものによって変わります。

出力アセンブリの出力先を制御する MSBuild プロパティが 2 つあり、プロジェクト ファイルまたはコマンド ラインで使用できます。

  • IncludeBuildOutput: ビルドの出力アセンブリをパッケージに含めるかどうかを決めるブール値。
  • BuildOutputTargetFolder: 出力アセンブリを配置するフォルダーを指定します。 出力アセンブリ (および他の出力ファイル) は、各フレームワーク フォルダーにコピーされます。

パッケージ参照

Package References (PackageReference) in Project Files」(プロジェクト ファイルのパッケージ参照 (PackageReference)) を参照してください。

プロジェクト間参照

プロジェクト間参照は、既定で NuGet パッケージ参照として見なされます。 次に例を示します。

<ProjectReference Include="..\UwpLibrary2\UwpLibrary2.csproj"/>

また、次のメタデータをプロジェクト参照に追加することもできます。

<IncludeAssets>
<ExcludeAssets>
<PrivateAssets>

パッケージにコンテンツを含める

コンテンツを含めるには、既存の <Content> 項目にメタデータを追加します。 次のようなエントリでオーバーライドしない場合、既定で "Content" という種類のすべての要素はパッケージに含まれます。

<Content Include="..\win7-x64\libuv.txt">
 <Pack>false</Pack>
</Content>

次のようにパッケージ パスを指定しない場合、既定では、すべてがパッケージ内の content および contentFiles\any\<target_framework> フォルダーのルートに追加され、相対フォルダー構造が保持されます。

<Content Include="..\win7-x64\libuv.txt">
  <Pack>true</Pack>
  <PackagePath>content\myfiles\</PackagePath>
</Content>

(content および contentFiles フォルダーの両方ではなく) すべてのコンテンツを特定のルート フォルダーにのみコピーする場合、MSBuild プロパティの ContentTargetFolders を使用できます。このプロパティの既定値は "content;contentFiles" ですが、他の任意のフォルダー名に設定できます。 ContentTargetFolders に "contentFiles" と指定するだけで、buildAction に基づいて contentFiles\any\<target_framework> または contentFiles\<language>\<target_framework> 以下にファイルが配置されます。

PackagePath には、セミコロンで区切った一連のターゲット パスを指定できます。 空のパッケージ パスを指定すると、ファイルはパッケージのルートに追加されます。 たとえば、次のように指定すると、libuv.txtcontent\myfilescontent\samples、およびパッケージ ルートに追加されます。

<Content Include="..\win7-x64\libuv.txt">
  <Pack>true</Pack>
  <PackagePath>content\myfiles;content\sample;;</PackagePath>
</Content>

また、MSBuild プロパティの $(IncludeContentInPack) もあり、既定値は true です。 これを任意のプロジェクトで false に設定すると、プロジェクトのコンテンツは NuGet パッケージに含まれません。

上記の任意の項目に設定できる他の pack 固有のメタデータとして、出力された nuspec の contentFiles エントリに CopyToOutput 値と Flatten 値を設定する <PackageCopyToOutput><PackageFlatten> があります。

Note

コンテンツ項目とは別に、<Pack><PackagePath> のメタデータは、ビルド アクション (Compile、EmbeddedResource、ApplicationDefinition、Page、Resource、SplashScreen、DesignData、DesignDataWithDesignTimeCreatableTypes、CodeAnalysisDictionary、AndroidAsset、AndroidResource、BundleResource、または None) でファイルに設定することもできます。

glob パターンの使用時にファイル名をパッケージ パスに付加する pack の場合、パッケージ パスの末尾にフォルダー セパレーター文字を付ける必要があります。そうしないと、パッケージ パスはファイル名を含む完全パスとして扱われます。

IncludeSymbols

MSBuild -t:pack -p:IncludeSymbols=true を使用すると、対応する .pdb ファイルは他の出力ファイル (.dll.exe.winmd.xml.json.pri) と共にコピーされます。 IncludeSymbols=true を設定すると、通常のパッケージシンボル パッケージが作成されます。

IncludeSource

これは、ソース ファイルと .pdb ファイルの両方がコピーされる点を除き、IncludeSymbols と同じです。 種類が Compile のすべてのファイルは src\<ProjectName>\ にコピーされ、結果のパッケージには相対パス フォルダー構造が保持されます。 TreatAsPackageReferencefalse に設定された任意の ProjectReference のソース ファイルも同様の結果になります。

種類が Compile のファイルがプロジェクト フォルダー以外の場所にある場合は、単に src\<ProjectName>\ に追加されます。

ライセンス式またはライセンス ファイルのパッキング

ライセンス式を使用する場合は、PackageLicenseExpression プロパティを使用します。 サンプルについては、「ライセンス式のサンプル」を参照してください。

<PropertyGroup>
    <PackageLicenseExpression>MIT</PackageLicenseExpression>
</PropertyGroup>

NuGet.org が受け付けるライセンス式とライセンスの詳細については、「ライセンス メタデータ」を参照してください。

ライセンス ファイルをパックする場合は、PackageLicenseFile プロパティを使用して、パッケージのルートを基準としたパッケージ パスを指定する必要があります。 さらに、ファイルがパッケージに含まれていることを確認する必要があります。 次に例を示します。

<PropertyGroup>
    <PackageLicenseFile>LICENSE.txt</PackageLicenseFile>
</PropertyGroup>

<ItemGroup>
    <None Include="licenses\LICENSE.txt" Pack="true" PackagePath=""/>
</ItemGroup>

サンプルについては、「ライセンス ファイルのサンプル」を参照してください。

Note

一度に指定できるのは、PackageLicenseExpressionPackageLicenseFilePackageLicenseUrl のどれか 1 つだけです。

拡張子のないファイルのパッキング

ライセンス ファイルをパックする場合など、一部のシナリオでは、拡張子のないファイルを含めることができます。 従来の理由から、NuGet および MSBuild は、拡張子がないパスをディレクトリとして扱います。

  <PropertyGroup>
    <TargetFrameworks>netstandard2.0</TargetFrameworks>
    <PackageLicenseFile>LICENSE</PackageLicenseFile>
  </PropertyGroup>

  <ItemGroup>
    <None Include="LICENSE" Pack="true" PackagePath=""/>
  </ItemGroup>  

拡張子のないファイルのサンプル

IsTool

MSBuild -t:pack -p:IsTool=true を使用すると、すべての出力ファイル (Output Assemblies シナリオに指定されているファイル) は、lib フォルダーではなく tools フォルダーにコピーされます。 これは、.csproj ファイルに PackageType を設定して指定する DotNetCliTool とは異なります。

.nuspec ファイルを用いたパック

通常、.nuspec ファイルに含まれるすべてのプロパティをプロジェクト ファイルに含めることもできますが、.nuspec ファイルを使用してプロジェクトをパックすることもできます。 PackageReference を使用する、SDK スタイル以外のプロジェクトの場合は、パック タスクを実行できるように NuGet.Build.Tasks.Pack.targets をインポートする必要があります。 nuspec ファイルをパックする前に、プロジェクトを復元する必要があります。 (SDK スタイルのプロジェクトには、既定でパック ターゲットが含まれています)。

プロジェクト ファイルのターゲット フレームワークは無関係であり、nuspec をパッケージ化するときには使用されません。 次の 3 つの MSBuild プロパティは、.nuspec を使用したパック操作に関連します。

  1. NuspecFile: パックに使用する .nuspec ファイルの相対パスまたは絶対パス。
  2. NuspecProperties: キー=値ペアのセミコロン区切りの一覧。 MSBuild コマンドラインの解析方法に従い、複数のプロパティは -p:NuspecProperties="key1=value1;key2=value2" のように指定する必要があります。
  3. NuspecBasePath: .nuspec ファイルのベース パス。

dotnet.exe を使用してプロジェクトをパックする場合は、次のようなコマンドを使用します。

dotnet pack <path to .csproj file> -p:NuspecFile=<path to nuspec file> -p:NuspecProperties=<> -p:NuspecBasePath=<Base path> 

MSBuild を使用してプロジェクトをパックする場合は、次のようなコマンドを使用します。

msbuild -t:pack <path to .csproj file> -p:NuspecFile=<path to nuspec file> -p:NuspecProperties=<> -p:NuspecBasePath=<Base path> 

dotnet.exeまたは msbuild を使用して nuspec をパックしても、既定でプロジェクトがビルドされることに注意してください。 これを回避するには、--no-build プロパティをdotnet.exeに渡します。これは、プロジェクト ファイルの <NoBuild>true</NoBuild> 設定および、プロジェクト ファイルの <IncludeBuildOutput>false</IncludeBuildOutput> 設定に相当します。

.csproj ファイルで nuspec ファイルをパックする例を次に示します。

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
    <NoBuild>true</NoBuild>
    <IncludeBuildOutput>false</IncludeBuildOutput>
    <NuspecFile>PATH_TO_NUSPEC_FILE</NuspecFile>
    <NuspecProperties>add nuspec properties here</NuspecProperties>
    <NuspecBasePath>optional to provide</NuspecBasePath>
  </PropertyGroup>
</Project>

カスタマイズされたパッケージを作成するための高度な拡張ポイント

pack ターゲットには、内部のターゲット フレームワーク固有のビルドで実行される 2 つの拡張ポイントが用意されています。 拡張機能ポイントでは、ターゲット フレームワーク固有のコンテンツとアセンブリをパッケージに含めることができます。

  • TargetsForTfmSpecificBuildOutput ターゲット: lib フォルダー、または BuildOutputTargetFolder で指定されたフォルダー内のファイルに使用します。
  • TargetsForTfmSpecificContentInPackage ターゲット: BuildOutputTargetFolder 外部のファイルに使用します。

TargetsForTfmSpecificBuildOutput

カスタム ターゲットを記述し、それを $(TargetsForTfmSpecificBuildOutput) プロパティの値として指定します。 BuildOutputTargetFolder (既定では lib) に移動する必要があるファイルの場合、ターゲットはこれらのファイルを ItemGroup BuildOutputInPackage に書き込み、次の 2 つのメタデータ値を設定します。

  • FinalOutputPath: ファイルの絶対パス。指定しない場合は、ID を使用してソース パスを評価します。
  • TargetPath: (省略可能) ファイルが、それぞれのカルチャ フォルダーの下にあるサテライト アセンブリのように、lib\<TargetFramework> 内のサブフォルダーに移動する必要がある場合に設定します。 既定値は、ファイルの名前です。

例:

<PropertyGroup>
  <TargetsForTfmSpecificBuildOutput>$(TargetsForTfmSpecificBuildOutput);GetMyPackageFiles</TargetsForTfmSpecificBuildOutput>
</PropertyGroup>

<Target Name="GetMyPackageFiles">
  <ItemGroup>
    <BuildOutputInPackage Include="$(OutputPath)cs\$(AssemblyName).resources.dll">
        <TargetPath>cs</TargetPath>
    </BuildOutputInPackage>
  </ItemGroup>
</Target>

TargetsForTfmSpecificContentInPackage

カスタム ターゲットを記述し、それを $(TargetsForTfmSpecificContentInPackage) プロパティの値として指定します。 パッケージに含めるファイルについては、ターゲットはそれらのファイルを ItemGroup TfmSpecificPackageFile に書き込み、次の省略可能なメタデータを設定します。

  • PackagePath: ファイルをパッケージに出力するパス。 NuGet は、同じパッケージ パスに複数のファイルが追加された場合に警告を発行します。
  • BuildAction: ファイルに割り当てるビルド アクション。パッケージ パスが contentFiles フォルダー内にある場合にのみ必要です。 既定値は "None" です。

例:

<PropertyGroup>
  <TargetsForTfmSpecificContentInPackage>$(TargetsForTfmSpecificContentInPackage);CustomContentTarget</TargetsForTfmSpecificContentInPackage>
</PropertyGroup>

<Target Name="CustomContentTarget">
  <ItemGroup>
    <TfmSpecificPackageFile Include="abc.txt">
      <PackagePath>mycontent/$(TargetFramework)</PackagePath>
    </TfmSpecificPackageFile>
    <TfmSpecificPackageFile Include="Extensions/ext.txt" Condition="'$(TargetFramework)' == 'net46'">
      <PackagePath>net46content</PackagePath>
    </TfmSpecificPackageFile>  
  </ItemGroup>
</Target>  

restore ターゲット

MSBuild -t:restore (nuget restoredotnet restore が .NET Core プロジェクトで使用) は、次のようにプロジェクト ファイルで参照されるパッケージを復元します。

  1. すべてのプロジェクト間参照を読み取ります
  2. プロジェクトのプロパティを読み取って、中間フォルダーとターゲット フレームワークを検出します
  3. MSBuild データを NuGet Build.Tasks.dll に渡します。
  4. restore を実行します
  5. パッケージのダウンロード
  6. アセット ファイル、ターゲット、およびプロパティを出力します

restore ターゲットは、PackageReference 形式を使用するプロジェクトに対して機能します。 MSBuild 16.5+ には、packages.config 形式用オプトイン サポートもあります。

Note

restore ターゲットは、build ターゲットと組み合わせて実行しないでください

Restore プロパティ

追加の restore 設定を、プロジェクト ファイルの MSBuild プロパティで指定することができます。 また、-p: スイッチを使用して、コマンド ラインから値を設定することもできます (次の例を参照してください)。

プロパティ 説明
RestoreSources パッケージ ソースのセミコロン区切りの一覧。
RestorePackagesPath ユーザー パッケージ フォルダーのパス。
RestoreDisableParallel ダウンロード数を一度に 1 つまでに制限します。
RestoreConfigFile 適用する Nuget.Config ファイルのパス。
RestoreNoHttpCache true の場合は、http キャッシュ パッケージの使用を回避します。 「グローバル パッケージとキャッシュ フォルダーの管理」をご覧ください。
RestoreIgnoreFailedSources true の場合、失敗した、または不足しているパッケージ ソースを無視します。
RestoreFallbackFolders フォールバック フォルダー。ユーザー パッケージ フォルダーを使用するのと同じ方法で使用されます。
RestoreAdditionalProjectSources 復元中に使用する追加のソース。
RestoreAdditionalProjectFallbackFolders 復元中に使用する追加のフォールバック フォルダー。
RestoreAdditionalProjectFallbackFoldersExcludes RestoreAdditionalProjectFallbackFolders で指定されたフォールバック フォルダーを除外します。
RestoreTaskAssemblyFile NuGet.Build.Tasks.dll のパス。
RestoreGraphProjectInput 復元するプロジェクトのセミコロン区切りの一覧。絶対パスを指定する必要があります。
RestoreUseSkipNonexistentTargets MSBuild でプロジェクトを収集する際、SkipNonexistentTargets 最適化を使用して収集を行うかどうかを判断します。 設定しない場合の既定値は true です。 その結果、プロジェクトのターゲットをインポートできない場合のフェイルファスト動作になります。
MSBuildProjectExtensionsPath 出力フォルダー。既定値は BaseIntermediateOutputPath および obj フォルダーです。
RestoreForce PackageReference ベースのプロジェクトで、最後の復元が成功した場合でも、すべての依存関係を強制的に解決します。 このフラグの指定は、project.assets.json ファイルの削除と似ています。 これは http キャッシュをバイパスしません。
RestorePackagesWithLockFile ロック ファイルの使用をオプトインします。
RestoreLockedMode ロック モードで復元を実行します。 つまり、復元によって依存関係は再評価されません。
NuGetLockFilePath ロック ファイルのカスタムの場所。 既定の場所はプロジェクトの隣にあり、packages.lock.json と名付けられています。
RestoreForceEvaluate 復元を強制して依存関係を再計算し、警告なしでロック ファイルを更新します。
RestorePackagesConfig packages.config を使用してプロジェクトを復元するオプトイン スイッチ。MSBuild -t:restore でのみサポートされます。
RestoreRepositoryPath packages.config のみ。 パッケージの復元先となるパッケージ ディレクトリを指定します。 指定されていない場合は、SolutionDirectory が使用されます。
RestoreUseStaticGraphEvaluation 標準評価ではなく、静的グラフ MSBuild 評価を使用するためのオプトイン スイッチ。 静的グラフの評価は、大規模なリポジトリとソリューションの場合大幅に高速化される、試験的な機能です。

ExcludeRestorePackageImports プロパティは、NuGet によって使用される内部プロパティです。 MSBuild ファイル内で、これを変更または設定しないでください。

コマンド ライン:

msbuild -t:restore -p:RestoreConfigFile=<path>

プロジェクト ファイル:

<PropertyGroup>
    <RestoreIgnoreFailedSources>true</RestoreIgnoreFailedSources>
</PropertyGroup>

restore の出力

restore で、次のファイルがビルドの obj フォルダーに作成されます。

ファイル 説明
project.assets.json すべてのパッケージ参照の依存関係グラフを格納します。
{projectName}.projectFileExtension.nuget.g.props パッケージに含まれる MSBuild プロパティへの参照
{projectName}.projectFileExtension.nuget.g.targets パッケージに含まれる MSBuild ターゲットへの参照

1 つの MSBuild コマンドを使用した復元とビルド

NuGet は、MSBuild ターゲットとプロパティを停止させるパッケージを復元できるため、復元とビルドの評価は異なるグローバル プロパティで実行されます。 つまり、次の動作は予測不能で、多くの場合間違った動作となります。

msbuild -t:restore,build

代わりに、次の方法をお勧めします。

msbuild -t:build -restore

同じロジックが、 build に類似した他のターゲットに適用されます。

MSBuild を持つ PackageReference および packages.config プロジェクトの復元

MSBuild 16.5 以降では、msbuild -t:restore で packages.config もサポートされています 。

msbuild -t:restore -p:RestorePackagesConfig=true

Note

packages.config 復元は、MSBuild 16.5+ でのみ利用可能であり、dotnet.exe では利用できません。

MSBuild 静的グラフ評価による復元

Note

MSBuild 16.6 以降では、NuGet にコマンド ラインからの静的グラフ評価を使用する試験的な機能が追加されており、大規模なリポジトリの復元時間が大幅に短縮されます。

msbuild -t:restore -p:RestoreUseStaticGraphEvaluation=true

または、Directory.Build.Props ファイルでプロパティを指定して有効にすることもできます。

<Project>
  <PropertyGroup>
    <RestoreUseStaticGraphEvaluation>true</RestoreUseStaticGraphEvaluation>
  </PropertyGroup>
</Project>

Note

Visual Studio 2019.x および NuGet 5.x の時点では、この機能は試験段階であり、オプトインと見なされます。 この機能が既定で有効になるタイミングの詳細については、NuGet/Home#9803 をフォローしてください。

静的グラフの復元では、復元の msbuild 部分、プロジェクトの読み取り、および評価が変更されますが、復元アルゴリズムは変更されません。 復元アルゴリズムは、すべての NuGet ツール (NuGet.exe、MSBuild.exe、dotnet.exe、Visual Studio) で同じです。

ごく少数のシナリオでは、静的グラフの復元動作が現在の復元とは異なる場合があり、特定の宣言済み PackageReference または ProjectReference が欠けている可能性があります。

安心材料として、静的グラフの復元に移行するときに、次のチェックを一度実行することを検討してください。

msbuild.exe -t:restore -p:RestoreUseStaticGraphEvaluation=true
msbuild.exe -t:restore

NuGet では、変更を報告しないでください。 不一致が発生した場合は、/HomeNuGet で問題を提出してください。

復元グラフの 1 つのライブラリを置き換える

復元結果のアセンブリが間違っている場合は、パッケージの既定の選択を除外し、独自の選択で置き換えることができます。 まず、最上位の PackageReference ですべてのアセットを除外します。

<PackageReference Include="Newtonsoft.Json" Version="9.0.1">
  <ExcludeAssets>All</ExcludeAssets>
</PackageReference>

次に、DLL の適切なローカル コピーに独自の参照を追加します。

<Reference Include="Newtonsoft.Json.dll" />