方法 : Visual Studio ビルド処理を拡張するHow to: Extend the Visual Studio Build Process

Visual StudioVisual Studio ビルド処理は、プロジェクト ファイルにインポートされる一連の MSBuildMSBuild .targets ファイルによって定義されます。The Visual StudioVisual Studio build process is defined by a series of MSBuildMSBuild .targets files that are imported into your project file. このインポートされるファイルの 1 つである Microsoft.Common.targets を拡張することで、ビルド処理の複数のポイントでカスタム タスクを実行できます。One of these imported files, Microsoft.Common.targets, can be extended to allow you to run custom tasks at several points in the build process. このトピックでは、Visual StudioVisual Studio ビルド処理を拡張するための 2 つの方法について説明します。This topic explains two methods you can use to extend the Visual StudioVisual Studio build process:

  • Microsoft.Common.targets で事前定義されている特定のターゲットをオーバーライドする。Overriding specific predefined targets defined in Microsoft.Common.targets.

  • Microsoft.Common.targets で定義されている "DependsOn" プロパティをオーバーライドする。Overriding the "DependsOn" properties defined in Microsoft.Common.targets.

事前定義されているターゲットをオーバーライドするOverriding Predefined Targets

Microsoft.Common.targets ファイルには、事前定義されている空のファイルが含まれています。この一連のファイルは、ビルド処理の一部の主要ターゲットの前後で呼び出されます。The Microsoft.Common.targets file contains a set of predefined empty targets that are called before and after some of the major targets in the build process. たとえば、MSBuildMSBuild は、メインの CoreBuild ターゲットの前に BeforeBuild ターゲットを、CoreBuild ターゲットの後に AfterBuild ターゲットを呼び出します。For example, MSBuildMSBuild calls the BeforeBuild target before the main CoreBuild target and the AfterBuild target after the CoreBuild target. 既定では、Microsoft.Common.targets の空のターゲットは何も行いませんが、その既定の動作をオーバーライドできます。その方法としては、Microsoft.Common.targets をインポートするプロジェクト ファイルでターゲットを定義します。By default, the empty targets in Microsoft.Common.targets do nothing, but you can override their default behavior by defining the targets you want in a project file that imports Microsoft.Common.targets. これを行うことで、MSBuildMSBuild タスクを利用し、ビルド処理をさらに細かく制御できます。By doing this, you can use MSBuildMSBuild tasks to give you more control over the build process.

事前定義されているターゲットをオーバーライドするにはTo override a predefined target

  1. オーバーライドする Microsoft.Common.targets で事前定義済みターゲットを見つけます。Identify a predefined target in Microsoft.Common.targets that you want to override. 下の表をご覧ください。これは安全にオーバーライドできるターゲットの完全一覧です。See the table below for the complete list of targets that you can safely override.

  2. プロジェクト ファイルの最後で、</Project> タグの直前で、ターゲットを定義します。Define the target or targets at the end of your project file, immediately before the </Project> tag. 例:For example:

    <Project>  
        ...  
        <Target Name="BeforeBuild">  
            <!-- Insert tasks to run before build here -->  
        </Target>  
        <Target Name="AfterBuild">  
            <!-- Insert tasks to run after build here -->  
        </Target>  
    </Project>  
    
  3. プロジェクト ファイルをビルドします。Build the project file.

    次の表は、Microsoft.Common.targets で安全にオーバーライドできるすべてのターゲットをまとめたものです。The following table shows all of the targets in Microsoft.Common.targets that you can safely override.

ターゲット名Target Name 説明Description
BeforeCompile, AfterCompileBeforeCompile, AfterCompile これらのターゲットのいずれかに挿入されているタスクは、コア コンパイル完了の前または後に実行されます。Tasks inserted in one of these targets run before or after core compilation is done. ほとんどのカスタマイズはこれら 2 つのターゲットのいずれかで行われます。Most customizations are done in one of these two targets.
BeforeBuild, AfterBuildBeforeBuild, AfterBuild これらのターゲットのいずれかに挿入されているタスクは、ビルド内の他のすべての前または後に実行されます。Tasks inserted in one of these targets will run before or after everything else in the build. 注: BeforeBuild ターゲットと AfterBuild ターゲットは、ほとんどのプロジェクト ファイルの終わりにあるコメントで既に定義されています。Note: The BeforeBuild and AfterBuild targets are already defined in comments at the end of most project files. これにより、ビルド前イベントとビルド後イベントをプロジェクト ファイルに簡単に追加できます。This allows you to easily add pre- and post-build events to your project file.
BeforeRebuild, AfterRebuildBeforeRebuild, AfterRebuild これらのターゲットのいずれかに挿入されているタスクは、コア再ビルド機能の呼び出しの前または後に実行されます。Tasks inserted in one of these targets run before or after the core rebuild functionality is invoked. Microsoft.Common.targets のターゲット実行順序は BeforeRebuildCleanBuildAfterRebuild です。The order of target execution in Microsoft.Common.targets is: BeforeRebuild, Clean, Build, and then AfterRebuild.
BeforeClean, AfterCleanBeforeClean, AfterClean これらのターゲットのいずれかに挿入されているタスクは、コア クリーン機能の呼び出しの前または後に実行されます。Tasks inserted in one of these targets run before or after the core clean functionality is invoked.
BeforePublish, AfterPublishBeforePublish, AfterPublish これらのターゲットのいずれかに挿入されているタスクは、コア公開機能の呼び出しの前または後に実行されます。Tasks inserted in one of these targets run before or after the core publish functionality is invoked.
BeforeResolveReference, AfterResolveReferencesBeforeResolveReference, AfterResolveReferences これらのターゲットのいずれかに挿入されているタスクは、アセンブリ参照解決の前または後に実行されます。Tasks inserted in one of these targets run before or after assembly references are resolved.
BeforeResGen, AfterResGenBeforeResGen, AfterResGen これらのターゲットのいずれかに挿入されているタスクは、リソース生成の前または後に実行されます。Tasks inserted in one of these targets run before or after resources are generated.

"DependsOn" プロパティをオーバーライドするOverriding "DependsOn" Properties

事前定義済みターゲットのオーバーライドはビルド処理を拡張する簡単な方法ですが、MSBuildMSBuild はターゲットの定義を順次評価するため、プロジェクトをインポートする別のプロジェクトが既にオーバーライドしているターゲットをオーバーライドすることを阻止できません。Overriding predefined targets is an easy way to extend the build process, but, because MSBuildMSBuild evaluates the definition of targets sequentially, there is no way to prevent another project that imports your project from overriding the targets you already have overridden. そのため、たとえば、プロジェクト ファイルに定義されている最後の AfterBuild ターゲットが、その他すべてのプロジェクトがインポートされた後に、ビルド中に使用されるターゲットになります。So, for example, the last AfterBuild target defined in the project file, after all other projects have been imported, will be the one that is used during the build.

ターゲットの意図しないオーバーライドを防ぐ方法があります。Microsoft.Common.targets ファイル全体で DependsOnTargets 属性で利用される "DependsOn" プロパティをオーバーライドします。You can guard against unintended overrides of targets by overriding the "DependsOn" properties that are used in DependsOnTargets attributes throughout the Microsoft.Common.targets file. たとえば、Build ターゲットには、DependsOnTargets 属性値 "$(BuildDependsOn)" が含まれています。For example, the Build target contains a DependsOnTargets attribute value of "$(BuildDependsOn)". 次の例を考えてみましょう。Consider:

<Target Name="Build" DependsOnTargets="$(BuildDependsOn)"/>  

XML のこの部分は、Build ターゲットを実行するには、BuildDependsOn プロパティに指定されているすべてのターゲットを先に実行する必要があります。This piece of XML indicates that before the Build target can run, all the targets specified in the BuildDependsOn property must run first. BuildDependsOn プロパティは次のように定義されています。The BuildDependsOn property is defined as:

<PropertyGroup>  
    <BuildDependsOn>  
        BeforeBuild;  
        CoreBuild;  
        AfterBuild  
    </BuildDependsOn>  
</PropertyGroup>  

プロジェクト ファイルの終わりで BuildDependsOn という名前の別のプロパティを宣言することでこのプロパティ値をオーバーライドできます。You can override this property value by declaring another property named BuildDependsOn at the end of your project file. 新しいプロパティに前の BuildDependsOn プロパティを含めることで、ターゲット一覧の最初と最後に新しいターゲットを追加できます。By including the previous BuildDependsOn property in the new property, you can add new targets to the beginning and end of the target list. 例:For example:

<PropertyGroup>  
    <BuildDependsOn>  
        MyCustomTarget1;  
        $(BuildDependsOn);  
        MyCustomTarget2  
    </BuildDependsOn>  
</PropertyGroup>  

<Target Name="MyCustomTarget1">  
    <Message Text="Running MyCustomTarget1..."/>  
</Target>  
<Target Name="MyCustomTarget2">  
    <Message Text="Running MyCustomTarget2..."/>  
</Target>  

プロジェクト ファイルをインポートするプロジェクトは、既に行っているカスタマイズを上書きすることなく、これらのプロパティをオーバーライドできます。Projects that import your project files can override these properties without overwriting the customizations that you have made.

"DependsOn" プロパティをオーバーライドするにはTo override a "DependsOn" property

  1. オーバーライドする Microsoft.Common.targets で事前定義済み "DependsOn" プロパティを見つけます。Identify a predefined "DependsOn" property in Microsoft.Common.targets that you want to override. 下の表をご覧ください。一般的にオーバーライドされる "DependsOn" プロパティの一覧です。See the table below for a list of the commonly overridden "DependsOn" properties.

  2. プロパティ ファイルの終わりにプロパティの別のインスタンスを定義します。Define another instance of the property or properties at the end of your project file. 新しいプロパティに元のプロパティ (たとえば、$(BuildDependsOn)) を含めます。Include the original property, for example $(BuildDependsOn), in the new property.

  3. プロパティ定義の前または後にカスタム ターゲットを定義します。Define your custom targets before or after the property definition.

  4. プロジェクト ファイルをビルドします。Build the project file.

一般的にオーバーライドされる "DependsOn" プロパティCommonly Overridden "DependsOn" Properties

プロパティ名Property Name 説明Description
BuildDependsOn ビルド処理全体の前または後にカスタム ターゲットを挿入する場合にオーバーライドするプロパティ。The property to override if you want to insert custom targets before or after the entire build process.
CleanDependsOn カスタム ビルド処理からの出力をクリーンアップする場合にオーバーライドするプロパティ。The property to override if you want to clean up output from your custom build process.
CompileDependsOn コンパイル手順の前または後にカスタム プロセスを挿入する場合にオーバーライドするプロパティ。The property to override if you want to insert custom processes before or after the compilation step.

関連項目See Also

Visual Studio の統合 Visual Studio Integration
MSBuild の概念 MSBuild Concepts
.Targets Files (.Targets ファイル).Targets Files