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 コマンドを使用します)。
ターゲットのビルド順序
pack
と restore
は 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
Owners
の Summary
および .nuspec
プロパティは、MSBuild ではサポートされていない点に注意してください。
属性/nuspec 値 | MSBuild プロパティ | 既定値 | メモ |
---|---|---|---|
Id |
PackageId |
$(AssemblyName) |
MSBuild からの $(AssemblyName) |
Version |
PackageVersion |
バージョン | これは、semver と互換性があります (たとえば、1.0.0 、1.0.0-beta 、1.0.0-beta-00345 )。 設定されていない場合、既定値は Version です。 |
VersionPrefix |
VersionPrefix |
空 | PackageVersion を設定すると VersionPrefix が上書きされます。 |
VersionSuffix |
VersionSuffix |
空 | PackageVersion を設定すると VersionSuffix が上書きされます。 |
Authors |
Authors |
現在のユーザーのユーザー名 | nuget.org 上のプロフィール名と一致するパッケージ作成者のセミコロン区切りのリスト。これらは、nuget.org の NuGet ギャラリーに表示され、同じ作成者によるパッケージの相互参照に使用されます。 |
Owners |
該当なし | nuspec にはありません。 | |
Title |
Title |
$(PackageId) |
人が読みやすいパッケージのタイトル。通常、nuget.org と、Visual Studio のパッケージ マネージャーの UI 画面で使用されます。 |
Description |
Description |
"パッケージの説明" | アセンブリの長い説明。 PackageDescription が指定されていない場合、このプロパティはパッケージの説明としても使用されます。 |
Copyright |
Copyright |
空 | パッケージの著作権の詳細。 |
RequireLicenseAcceptance |
PackageRequireLicenseAcceptance |
false |
クライアントがユーザーに対して、パッケージのインストール前にパッケージ ライセンスに同意することを必須にするかどうかを示すブール値。 |
license |
PackageLicenseExpression |
空 | <license type="expression"> に相当します。 「ライセンス式またはライセンス ファイルのパッキング」を参照してください。 |
license |
PackageLicenseFile |
空 | カスタム ライセンス、または SPDX 識別子が割り当てられていないライセンスを使用している場合、パッケージ内のライセンス ファイルへのパス。 参照されているライセンス ファイルを明示的にパックする必要があります。 <license type="file"> に相当します。 「ライセンス式またはライセンス ファイルのパッキング」を参照してください。 |
LicenseUrl |
PackageLicenseUrl |
空 | PackageLicenseUrl は非推奨とされます。 代わりに、PackageLicenseExpression タグまたは PackageLicenseFile タグを使用してください。 |
ProjectUrl |
PackageProjectUrl |
空 | |
Icon |
PackageIcon |
空 | パッケージ アイコンとして使用するパッケージ内の画像へのパス。 参照されているアイコン画像ファイルを明示的にパックする必要があります。 詳細については、「アイコン画像ファイルのパッキング」および、「icon メタデータ」を参照してください。 |
IconUrl |
PackageIconUrl |
空 | PackageIconUrl は非推奨であり、代わりに PackageIcon を使ってください。 ただし、最適なダウンレベル エクスペリエンスを得るためには、PackageIconUrl に加えて PackageIcon を指定する必要があります。 |
Readme |
PackageReadmeFile |
空 | 参照される readme ファイルを明示的にパックする必要があります。 |
Tags |
PackageTags |
空 | パッケージを指定するタグのセミコロン区切りの一覧。 |
ReleaseNotes |
PackageReleaseNotes |
空 | パッケージのリリース ノート。 |
Repository/Url |
RepositoryUrl |
空 | ソース コードの複製または取得に使用されるリポジトリ URL。 例: https://github.com/NuGethttps://github.com/NuGet/NuGet.Client.git |
Repository/Type |
RepositoryType |
空 | リポジトリの種類。 例: git (既定値)、tfs |
Repository/Branch |
RepositoryBranch |
空 | オプションのリポジトリ ブランチ情報。 このプロパティを含めるには、RepositoryUrl も指定する必要があります。 例: master (NuGet 4.7.0 以降)。 |
Repository/Commit |
RepositoryCommit |
空 | 任意のリポジトリ コミットまたは変更セット。パッケージがどのソースに対してビルドされたかを示します。 このプロパティを含めるには、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 |
開発専用の依存関係としてパッケージをマークするかどうかを指定するブール値。指定すると、そのパッケージは他のパッケージに依存関係として含まれなくなります。 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 パッケージからのパッケージの依存関係を抑制するには、SuppressDependenciesWhenPacking
を true
に設定すると、生成された 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.txt
は content\myfiles
、content\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>\
にコピーされ、結果のパッケージには相対パス フォルダー構造が保持されます。 TreatAsPackageReference
が false
に設定された任意の 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
一度に指定できるのは、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
ファイルを使用してプロジェクトをパックすることもできます。 PackageReference
を使用する、SDK スタイル以外のプロジェクトの場合は、パック タスクを実行できるように NuGet.Build.Tasks.Pack.targets
をインポートする必要があります。 nuspec ファイルをパックする前に、プロジェクトを復元する必要があります。 (SDK スタイルのプロジェクトには、既定でパック ターゲットが含まれています)。
プロジェクト ファイルのターゲット フレームワークは無関係であり、nuspec をパッケージ化するときには使用されません。 次の 3 つの MSBuild プロパティは、.nuspec
を使用したパック操作に関連します。
NuspecFile
: パックに使用する.nuspec
ファイルの相対パスまたは絶対パス。NuspecProperties
: キー=値ペアのセミコロン区切りの一覧。 MSBuild コマンドラインの解析方法に従い、複数のプロパティは-p:NuspecProperties="key1=value1;key2=value2"
のように指定する必要があります。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 restore
と dotnet restore
が .NET Core プロジェクトで使用) は、次のようにプロジェクト ファイルで参照されるパッケージを復元します。
- すべてのプロジェクト間参照を読み取ります
- プロジェクトのプロパティを読み取って、中間フォルダーとターゲット フレームワークを検出します
- MSBuild データを NuGet Build.Tasks.dll に渡します。
- restore を実行します
- パッケージのダウンロード
- アセット ファイル、ターゲット、およびプロパティを出力します
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 評価を使用するためのオプトイン スイッチ。 静的グラフの評価は、大規模なリポジトリとソリューションの場合大幅に高速化される、試験的な機能です。 |
RestoreUseLegacyDependencyResolver |
レガシ依存関係リゾルバーを使用するためのオプトアウト。 NuGet の依存関係リゾルバーの実装は、6.12 リリースで書き換えられました。 このスイッチにより、以前のアルゴリズムが強制的に使用されます。 |
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" />