MSBuild 変換MSBuild Transforms

変換とは、1 つの項目一覧を別の項目コレクションに一対一で変換することです。A transform is a one-to-one conversion of one item list to another. プロジェクトで項目一覧を変換できます。さらに変換により、ターゲットは入出力間の直接割り当てを指定できるようになります。In addition to enabling a project to convert item lists, a transform enables a target to identify a direct mapping between its inputs and outputs. このトピックでは、変換と、MSBuildMSBuild で変換を利用してプロジェクトを効率的にビルドする方法について説明します。This topic explains transforms and how MSBuildMSBuild uses them to build projects more efficiently.

変換修飾子Transform Modifiers

変換は任意ではなく、特別な構文により制限されています。変換修飾子はすべて %(ItemMetaDataName) という形式にする必要があります。Transforms are not arbitrary, but are limited by special syntax in which all transform modifiers must be in the format %(ItemMetaDataName). あらゆる項目メタデータを変換修飾子として使用できます。Any item metadata can be used as a transform modifier. これには、作成時にすべての項目に割り当てられる既知の項目メタデータが含まれます。This includes the well-known item metadata that is assigned to every item when it is created. 既知の項目メタデータの一覧については、「既知の項目メタデータ」をご覧ください。For a list of well-known item metadata, see Well-known Item Metadata.

次の例では、.resx ファイルの一覧が .resources ファイルの一覧に変換されます。In the following example, a list of .resx files is transformed into a list of .resources files. %(filename) 変換修飾子は、各 .resources ファイルに対応する .resx ファイルと同じファイル名が与えられることを指定します。The %(filename) transform modifier specifies that each .resources file has the same file name as the corresponding .resx file.

@(RESXFile->'%(filename).resources')  

注意

標準の項目一覧に区切りを指定するのと同じ方法で、変換後の項目一覧にカスタムの区切りを指定できます。You can specify a custom separator for a transformed item list in the same way you specify a separator for a standard item list. たとえば、変換後の項目一覧を既定のセミコロン (;) ではなくコンマ (,) で区切るには、次の XML を使用します。For example, to separate a transformed item list by using a comma (,) instead of the default semicolon (;), use the following XML.

@(RESXFile->'Toolset\%(filename)%(extension)', ',')  

たとえば、@(RESXFile) 項目一覧の項目が Form1.resxForm2.resxForm3.resx の場合、変換後の項目一覧の出力は Form1.resourcesForm2.resourcesForm3.resources になります。For example, if the items in the @(RESXFile) item list are Form1.resx, Form2.resx, and Form3.resx, the outputs in the transformed list will be Form1.resources, Form2.resources, and Form3.resources.

複数の修飾子を使用するUsing Multiple Modifiers

変換式には、複数の修飾子を含めることができます。複数の修飾子は任意の順序で結合したり、繰り返したりできます。A transform expression can contain multiple modifiers, which can be combined in any order and can be repeated. 次の例では、ファイルを含むディレクトリの名前が変更されますが、ファイルは元の名前とファイル名拡張子を維持します。In the following example, the name of the directory that contains the files is changed but the files retain the original name and file name extension.

@(RESXFile->'Toolset\%(filename)%(extension)')  

たとえば、RESXFile 項目一覧に含まれる項目が Project1\Form1.resxProject1\Form2.resxProject1\Form3.text の場合、変換後の項目一覧の出力は Toolset\Form1.resxToolset\Form2.resxToolset\Form3.text になります。For example, if the items that are contained in the RESXFile item list are Project1\Form1.resx, Project1\Form2.resx, and Project1\Form3.text, the outputs in the transformed list will be Toolset\Form1.resx, Toolset\Form2.resx, and Toolset\Form3.text.

依存関係の分析Dependency Analysis

変換では、変換後の項目一覧と元の項目一覧の間に存在する一対一のマッピングか維持されます。Transforms guarantee a one-to-one mapping between the transformed item list and the original item list. そのため、入力の変換である出力がターゲットによって作成される場合、MSBuildMSBuild は、入力と出力のタイムスタンプを分析し、ターゲットをスキップ、ビルド、部分的再ビルドするかどうかを決定します。Therefore, if a target creates outputs that are transforms of the inputs, MSBuildMSBuild can analyze the timestamps of the inputs and outputs, and decide whether to skip, build, or partially rebuild a target.

次の例の [タスクをコピー] では、BuiltAssemblies 項目一覧のすべてのファイルが、Outputs 属性の変換によって指定される、タスクのターゲット フォルダーにマッピングされます。In the Copy Task in the following example, every file in the BuiltAssemblies item list maps to a file in the destination folder of the task, specified by using a transform in the Outputs attribute. BuiltAssemblies 項目一覧のファイルが変更されると、Copy タスクは変更されたファイルにだけ実行され、他のファイルはすべてスキップされます。If a file in the BuiltAssemblies item list changes, the Copy task will be run only for the changed file and all other files will be skipped. 依存関係分析と変換の使用方法に関する詳細については、「インクリメンタル ビルドを実行する方法」を参照してください。For more information about dependency analysis and how to use transforms, see How to: Build Incrementally.

<Target Name="CopyOutputs"  
    Inputs="@(BuiltAssemblies)"  
    Outputs="@(BuiltAssemblies -> '$(OutputPath)%(Filename)%(Extension)')">  

    <Copy  
        SourceFiles="@(BuiltAssemblies)"  
        DestinationFolder="$(OutputPath)"/>  

</Target>  

Example

説明Description

次の例では、変換を使用する MSBuildMSBuild プロジェクト ファイルが確認できます。The following example shows an MSBuildMSBuild project file that uses transforms. この例では、c:\sub0\sub1\sub2\sub3 ディレクトリに .xsd ファイルが 1 つだけ存在し、作業ディレクトリが c:\sub0 であると想定されています。This example assumes that there is just one .xsd file in the c:\sub0\sub1\sub2\sub3 directory, and that the working directory is c:\sub0.

コードCode

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">  
    <ItemGroup>  
        <Schema Include="sub1\**\*.xsd"/>  
    </ItemGroup>  

    <Target Name="Messages">  
        <Message Text="rootdir: @(Schema->'%(rootdir)')"/>  
        <Message Text="fullpath: @(Schema->'%(fullpath)')"/>  
        <Message Text="rootdir + directory + filename + extension: @(Schema->'%(rootdir)%(directory)%(filename)%(extension)')"/>  
        <Message Text="identity: @(Schema->'%(identity)')"/>  
        <Message Text="filename: @(Schema->'%(filename)')"/>  
        <Message Text="directory: @(Schema->'%(directory)')"/>  
        <Message Text="relativedir: @(Schema->'%(relativedir)')"/>  
        <Message Text="extension: @(Schema->'%(extension)')"/>  
    </Target>  
</Project>  

コメントComments

この例を実行すると、次の出力が生成されます。This example produces the following output.

rootdir: C:\  
fullpath: C:\xmake\sub1\sub2\sub3\myfile.xsd  
rootdir + directory + filename + extension: C:\xmake\sub1\sub2\sub3\myfile.xsd  
identity: sub1\sub2\sub3\myfile.xsd  
filename: myfile  
directory: xmake\sub1\sub2\sub3\  
relativedir: sub1\sub2\sub3\  
extension: .xsd  

関連項目See Also

MSBuild の概念 MSBuild Concepts
MSBuild リファレンス MSBuild Reference
方法: インクリメンタル ビルドを実行するHow to: Build Incrementally