共用方式為


MSBuild 轉換

更新:2007 年 11 月

轉換是以一對一的方式將某個項目集合轉換成另一個。轉換除了可以讓專案轉換項目集合以外,也可以讓目標 (Target) 識別出其輸入和輸出之間的直接對應。本主題解釋轉換,以及 MSBuild 如何使用轉換更有效率地建置專案。

轉換修飾詞

轉換並非任意執行,而是受限於特定語法,其中所有轉換修飾詞 (Modifier) 的格式須為 %(ItemMetaDataName)。任何項目中繼資料都可做為轉換修飾詞使用,包括建立時指派給每個項目的已知項目中繼資料。如需已知項目中繼資料的清單,請參閱 MSBuild 已知的項目中繼資料

在下列範例中,會將 .resx 檔的清單轉換成 .resources 檔的清單。轉換修飾詞 %(檔名) 會指定每個 .resources 檔的檔名與對應的 .resx 檔相同。

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

注意事項:

您可以使用可用於一般項目集合的方式,為已轉換的項目集合指定自訂分隔符號。例如,若要以逗號 (,) 而非預設的分號 (;) 分隔已轉換的項目集合,請使用下列 XML:

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

例如,如果 @(RESXFile) 項目集合中的項目為 Form1.resx、Form2.resx 與 Form3.resx,則已轉換清單中的輸出將會是 Form1.resources、Form2.resources 與 Form3.resources。

使用多個修飾詞

轉換可包含多個能夠依據任意順序結合的修飾詞,而且修飾詞可在轉換運算式 (Transform Expression) 中重複。在下列範例中,包含檔案的目錄名稱已變更,但檔案仍維持原始名稱與副檔名。

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

例如,如果 RESXFile 項目集合中的項目為 Project1\Form1.resx、Project1\Form2.resx 與 Project1\Form3.text,則已轉換清單中的輸出將會是 Toolset\Form1.resx、Toolset\Form2.resx 與 Toolset\Form3.text。

相依性分析

轉換能保證已轉換項目集合與原始項目集合之間的一對一對應。因此,當目標建立的輸出為輸入的轉換時,MSBuild 即可分析輸入和輸出的時間戳記 (Timestamp),並決定要略過、建置或部分重建目標。

在下列範例的 Copy 工作中,BuiltAssemblies 項目集合中的每個檔案都會對應至該工作目的資料夾中的某個檔案,此檔案由轉換在 Outputs 屬性中指定。如果 BuiltAssemblies 項目集合中有任何檔案變更,則只會針對已變更的檔案執行 Copy 工作,並且略過其他所有檔案。如需相依性分析和使用轉換的詳細資訊,請參閱 HOW TO:累加建置

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

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

</Target>

範例

描述

下列範例說明使用轉換的 MSBuild 專案檔。這個範例會假設 c:\sub0\sub1\sub2\sub3 目錄中只有一個 .xsd 檔,以及一個工作目錄 c:\sub0。

程式碼

<Project xmlns="https://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>

註解

這個範例產生下列輸出:

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

請參閱

工作

HOW TO:累加建置

其他資源

MSBuild 概念

MSBuild 參考