web-dev-qa-db-ja.com

nuget propsファイルとは何ですか?その用途は何ですか?

私は周りを見回してたくさん読んでいますが、「nuget.props」ファイルが何であり、それが何に使用されているのかを説明する明確な答えを見つけることができませんでした。

何か説明があり、おそらくいくつかの例が参考になりますか?

9
Dave23Rave

いくつかの背景情報から始めて、.NETプロジェクトはMSBuildでビルドされます。 C#プロジェクトの.csprojは、ファイル拡張子が付いたMSBuildプロジェクトファイルであり、通常はC#であり、他の言語ではないことを通知しますが、MSBuildに対しては単なるプロジェクトファイルです。 MSBuildには、基本タイプ、プロパティ、アイテム、ターゲット、およびタスクがいくつかあります。慣例により、プロパティとアイテムは拡張子.propsのファイルに入れられ、タスクとターゲットは.targetsで終わるファイルに入れられます。そのため、古いスタイルのcsprojファイルを見ると、<Import Project="path\to\Microsoft.Common.CSharp.props" /><Import Project="path\to\Microsoft.Common.CSharp.props" />が表示されます。新しい、SDKスタイルのプロジェクトは 基本的には構文糖 で、まったく同じことを行います。

次に、MSBuildチームと.NETチームがビルドシステムを拡張可能にしました。したがって、MicrosoftがC#コンパイラ/ビルドシステムに組み込んだものに限定されるのではなく、ビルドシステムの一部を交換したり、ビルドシステムに追加したりできます。 NuGetがない場合、これを行う方法は、独自の.propsおよび.targetsファイルをどこかに作成し、.csprojを編集して<Import ... />ステートメントを追加することです。小道具とターゲットがそれを使用しているものと同じソースコードリポジトリにある場合、これは正常に機能しますが、csprojを編集してpropsおよびtargetsファイルへのパスをハードコーディングしても機能しません。そうでなければ。

NuGetがこれを支援します。 適切な規則 でパッケージを作成する場合、NuGetは、プロップとターゲットが検出され、ビルドで使用されることを確認します。 packages.configを使用するプロジェクトでは、NuGetは、インストール/アップグレード/アンインストール時にcsprojを編集します。 PackageReferenceを使用するプロジェクト、NuGetは、obj/およびnuget.g.propsという名前の中間ディレクトリ(nuget.g.targetsフォルダー)にファイルを書き込みます。これにより、すべてのpropsおよび参照されているすべてのNuGetパッケージのtargetsファイル。ビルドシステムはこれらのファイルを使用します。

システムにインストールされているバージョンよりも新しいバージョンの.NETコンパイラを使用する場合は、なぜこれを実行するのかを最初に考えることができます。 Microsoft.Net.Compilers パッケージを参照するだけで、パッケージ内の.propsおよび.targetsが、システムにインストールされたビルドシステムのコンパイルターゲット/タスクを置き換え、代わりにパッケージからのもの。これにより、コンパイラがシステムにインストールされる前に、または異なる開発者やCIエージェントに異なるバージョンのものがインストールされている場合でも、コードのすべてのビルドが同じコンパイラを使用するようにしたい場合に、新しい言語機能を使用できます。

別の例としては、事前にコンパイルされたスクリプトがあります。独自のスクリプト言語がある場合は、それらをC#ファイルに変換するビルドツールを作成し、「実際のビルド」の前に実行するMSBuildプロップとターゲットを記述して、カスタム言語をC#に変換し、生成された.csファイルを保存します。中間フォルダーにこれらの生成されたファイルのMSBuildコンパイルアイテムを追加すると、C#コンパイラーはそれをプロジェクト内の他のすべての.csファイルと一緒にコンパイルします。 MSBuildと.NETビルドシステムについては、ある程度の知識が必要ですが、可能です。

12
zivkan