NuGet ターゲットとして MSBuild パックおよび復元する

NuGet 4.0+

PackageReference 形式では、4.0 以降では、NuGet別.nuspecのファイルを使用するのではなく、すべてのマニフェスト メタデータをプロジェクト ファイル内に直接格納できます。

15.1 以降ではMSBuild、NuGet以下で説明するように、ターゲットをrestore持つpack一流MSBuildの市民でもあります。 これらのターゲットを使用すると、他MSBuildのNuGetタスクやターゲットと同様に操作できます。 使用してパッケージを作成するNuGet手順については、「を使用してMSBuildパッケージMSBuildを作成する」をNuGet参照してください。 (For NuGet 3.x 以前では、代わりに CLI を使用して パック コマンドと 復元 コマンドを NuGet 使用します)。

ターゲットのビルド順序

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

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

同様に、タスクの作成、独自の MSBuild ターゲットの作成、タスクのプロパティの使用 NuGet を行 MSBuild うことができます。

注意

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

pack ターゲット

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

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

注意

Owners および Summary プロパティの使用 .nuspec はサポートされていません MSBuild。

属性/nuspec 値 MSBuild プロパティ Default メモ
Id PackageId $(AssemblyName) MSBuild からの $(AssemblyName)
Version PackageVersion バージョン これは、たとえば、semver 互換1.0.01.0.0-betaです。または 1.0.0-beta-00345. 既定値は Version 設定されていない場合です。
VersionPrefix VersionPrefix empty 上書きを設定 PackageVersion する VersionPrefix
VersionSuffix VersionSuffix empty 上書きを設定 PackageVersion する VersionSuffix
Authors Authors 現在のユーザーのユーザー名 nuget.org のプロファイル名と一致する、セミコロンで区切られたパッケージ作成者のリスト。これらは、nuget.org のギャラリーに表示 NuGet され、同じ作成者によるパッケージの相互参照に使用されます。
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 の NuGet ギャラリーに表示され、同じ作成者によるパッケージの相互参照に使用されます。
Description アセンブリの長い説明。 PackageDescription が指定されていない場合、このプロパティはパッケージの説明としても使用されます。
Copyright パッケージの著作権の詳細。
PackageRequireLicenseAcceptance クライアントがユーザーに対して、パッケージのインストール前にパッケージ ライセンスに同意することを必須にするかどうかを示すブール値。 既定値は、false です。
DevelopmentDependency 開発専用の依存関係としてパッケージをマークするかどうかを指定するブール値。指定すると、そのパッケージは他のパッケージに依存関係として含まれなくなります。 (NuGet4.8 以降) の場合PackageReference、このフラグは、コンパイル時の資産がコンパイルから除外されることを意味します。 詳しくは、「DevelopmentDependency support for PackageReference (PackageReference に対する DevelopmentDependency のサポート)」をご覧ください。
PackageLicenseExpression たとえば、Apache-2.0SPDX ライセンス識別子または式。 詳細については、「 ライセンス式またはライセンス ファイルのパッキング」を参照してください。
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" の場合、PDB、DLL、およびその他の出力ファイルを含む .symbols.nupkg 拡張子を使用してレガシ シンボル パッケージが作成されます。 "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 のシナリオ

依存関係の抑制

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

PackageIconUrl

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

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

5.10.0 プレビュー 2.NET SDK 5.0.300 以降でNuGetサポートされています /

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 の出力ファイルをコピーします。 コピーされる出力ファイルは、ターゲットからのBuiltOutputProjectGroup提供内容MSBuildによって異なります。

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

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

パッケージ参照

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

プロジェクト間参照

プロジェクト参照へのProjectは、既定ではパッケージ参照と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>

すべてのコンテンツを (両方ではなく) 特定のcontentcontentFilesルート フォルダーのみにコピーする場合は、プロパティを使用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 パッケージに含まれません。

上記の項目のいずれかで設定できるその他のパック固有のメタデータには、<PackageFlatten>出力のエントリのセットCopyToOutputFlatten値がcontentFiles含まれます<PackageCopyToOutput>nuspec。

注意

コンテンツ項目とは別に、<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>

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

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

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

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

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

注意

一度に PackageLicenseExpression指定できる 、 PackageLicenseFile、のいずれか PackageLicenseUrl 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してプロジェクトをパックすることもできます。 SDK スタイル以外のプロジェクトを使用 PackageReferenceする場合は、パック タスクを実行できるようにインポート 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 すると、既定でプロジェクトがビルドされることにも注意してください。 これは、プロジェクト ファイル内の設定とプロジェクト ファイル<IncludeBuildOutput>false</IncludeBuildOutput> の設定<NoBuild>true</NoBuild> と同じプロパティをdotnet.exeに渡--no-buildすことによって回避できます。

ファイルをパックする .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 target: フォルダー内の lib ファイルまたは指定したフォルダーに使用します BuildOutputTargetFolder
  • TargetsForTfmSpecificContentInPackage target: 外部のファイルに使用します BuildOutputTargetFolder

TargetsForTfmSpecificBuildOutput

カスタム ターゲットを記述し、プロパティの $(TargetsForTfmSpecificBuildOutput) 値として指定します。 (既定では lib) に入 BuildOutputTargetFolder る必要があるファイルの場合、ターゲットはこれらのファイルを 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. .Build.Tasks.dll にデータをNuGet渡すMSBuild
  4. restore を実行します
  5. パッケージのダウンロード
  6. アセット ファイル、ターゲット、およびプロパティを出力します

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

注意

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

restore のプロパティ

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

プロパティ 説明
RestoreSources パッケージ ソースのセミコロン区切りの一覧。
RestorePackagesPath ユーザー パッケージ フォルダーのパス。
RestoreDisableParallel ダウンロード数を一度に 1 つまでに制限します。
RestoreConfigFile 適用する Nuget.Config ファイルのパス。
RestoreNoCache true の場合は、キャッシュされたパッケージの使用を回避します。 グローバル パッケージとキャッシュ フォルダーの管理を参照してください
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 含まれる prop への参照
{projectName}.projectFileExtension.nuget.g.targets パッケージに含まれるターゲットへの MSBuild 参照

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

ターゲットとプロパティを NuGet ダウン MSBuild させるパッケージを復元できるため、復元とビルドの評価は異なるグローバル プロパティで実行されます。 これは、次の動作が予測不可能で、多くの場合、正しくない動作が発生することを意味します。

msbuild -t:restore,build

代わりに、推奨される方法は次のとおりです。

msbuild -t:build -restore

同様の他のターゲットにも同じロジックが build適用されます。

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

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

msbuild -t:restore -p:RestorePackagesConfig=true

注意

packages.config 復元は、⿇〘 MSBuild 16.5+〘でのみ使用でき、 dotnet.exe

静的グラフ評価を使用した MSBuild 復元

注意

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

msbuild -t:restore -p:RestoreUseStaticGraphEvaluation=true

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

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

注意

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

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

ごく少数のシナリオでは、静的グラフの復元の動作が現在の復元とは異なる場合があり、特定の宣言された PackageReferences または ProjectReference が見つからない可能性があります。

簡単にするために、1 回のチェックとして、静的グラフの復元に移行する場合は、次の実行を検討してください。

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

NuGet 変更を報告 しないでください 。 不一致が表示される場合は、/Home でNuGet問題を提出してください。

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

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

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

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

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