ToolsVersion 設定のオーバーライド
Visual Studio と MSBuild プロジェクト ファイルの Project 要素の ToolsVersion
属性は、Visual Studio 2019 以降では廃止されたと見なされており、安全に削除できます。 この記事では、以前のバージョンの MSBuild またはカスタム ツールセットでの使用について説明します。 「標準ツールセット構成とカスタム ツールセット構成」をご覧ください。
プロジェクトおよびソリューションのツールセットは、次の 3 つの方法のいずれかで変更できます。
コマンド ラインからプロジェクトまたはソリューションをビルドする場合は、
-ToolsVersion
スイッチ (省略形は-tv
) を使用します。MSBuild タスクに
ToolsVersion
パラメーターを設定します。ソリューション内のプロジェクトに
$(ProjectToolsVersion)
プロパティを設定します。 これにより、他のプロジェクトとは異なるツールセットのバージョンを使用して、ソリューション内にプロジェクトをビルドできます。
コマンド ラインでのビルドでプロジェクトおよびソリューションの ToolsVersion 設定をオーバーライドする
Visual Studio プロジェクトは通常、プロジェクト ファイルに指定された ToolsVersion でビルドされますが、コマンド ラインで -ToolsVersion
(または -tv
) スイッチを指定することによって、プロジェクト ファイルの ToolsVersion 値をオーバーライドし、すべてのプロジェクトとそのプロジェクト間依存関係を別のツールセットでビルドできます。 たとえば次のような点です。
msbuild.exe someproj.proj -tv:12.0 -p:Configuration=Debug
この例では、すべてのプロジェクトが ToolsVersion 12.0 でビルドされます (後の「優先順位」を参照してください)。
コマンド ラインで -tv
スイッチを使用するときには、特定のプロジェクトに $(ProjectToolsVersion)
プロパティを指定し、ソリューション内の他のプロジェクトとは異なる ToolsVersion 値でビルドすることもできます。
MSBuild タスクの ToolsVersion パラメーターを使用して ToolsVersion 設定をオーバーライドする
MSBuild タスクは、あるプロジェクトで別のプロジェクトをビルドするための主要な手段です。 MSBuild タスクには、プロジェクトに指定された値とは異なる ToolsVersion でプロジェクトをビルドすることが可能となる省略可能なタスク パラメーター ToolsVersion
が用意されています。 このパラメーターを使用する方法を次の例に示します。
次のコードを含む projectA.proj という名前のファイルを作成します。
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="12.0"> <Target Name="go" > <Message Text="projectA.proj" /> <Message Text="MSBuildToolsVersion: $(MSBuildToolsVersion)" /> <Message Text="MSBuildToolsPath: $(MSBuildToolsPath)" /> <MSBuild Projects="projectB.proj" ToolsVersion="2.0" Targets="go" /> </Target> </Project>
次のコードを含む projectB.proj という名前の別のファイルを作成します。
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="12.0"> <Target Name="go"> <Message Text="projectB.proj" /> <Message Text="MSBuildToolsVersion: $(MSBuildToolsVersion)" /> <Message Text="MSBuildToolsPath: $(MSBuildToolsPath)" /> </Target> </Project>
コマンド プロンプトに次のコマンドを入力します。
msbuild projectA.proj -t:go -toolsversion:3.5
次のような出力が表示されます。
projectA
では、コマンド ラインに設定された-toolsversion:3.5
が、ToolsVersion=12.0
タグに設定されたProject
をオーバーライドします。ProjectB
はprojectA
内のタスクによって呼び出されます。 そのタスクにはToolsVersion=2.0
が設定されており、この設定は、ToolsVersion
の他のprojectB
設定をオーバーライドします。Output: projectA.proj MSBuildToolsVersion: 3.5 MSBuildToolsPath: C:\Windows\Microsoft.NET\Framework\v3.5 projectB.proj MSBuildToolsVersion: 2.0 MSBuildToolsPath: C:\Windows\Microsoft.NET\Framework\v2.0.50727
優先順位
ToolsVersion
は、次の優先順位に基づいて決定されます (順位の高いものから先に挙げています)。
プロジェクトのビルドに使用される MSBuild タスクの
ToolsVersion
属性。msbuild.exe のコマンドで使用される
-toolsversion
(または-tv
) スイッチ。環境変数
MSBUILDTREATALLTOOLSVERSIONSASCURRENT
が設定されている場合は、現在のToolsVersion
を使用します。環境変数
MSBUILDTREATHIGHERTOOLSVERSIONASCURRENT
が設定され、プロジェクト ファイルで定義されているToolsVersion
が現在のToolsVersion
よりも大きい場合は、現在のToolsVersion
を使用します。環境変数
MSBUILDLEGACYDEFAULTTOOLSVERSION
が設定されているか、またはToolsVersion
が設定されていない場合は、次の手順が使用されます。プロジェクト ファイルにある Project 要素の
ToolsVersion
属性。 この属性が存在しない場合は、現在のバージョンであると見なされます。MSBuild.exe.config ファイルに定義された既定のツール バージョン。
レジストリに定義された既定のツール バージョン。 詳細については、「標準ツールセット構成とカスタム ツールセット構成」を参照してください。
環境変数
MSBUILDLEGACYDEFAULTTOOLSVERSION
が設定されていない場合は、次の手順が使用されます。環境変数
MSBUILDDEFAULTTOOLSVERSION
が存在するToolsVersion
に設定されている場合は、それを使用します。DefaultOverrideToolsVersion
が MSBuild.exe.config で設定されている場合は、それを使用します。DefaultOverrideToolsVersion
がレジストリで設定されている場合は、それを使用します。それ以外の場合は、現在の
ToolsVersion
を使用します。