2011-03-28 77 views
3

我想在我的目標中使用「MSBuild」任務來構建另一個項目,同時將一些項目(及其元數據)從當前項目傳遞到要構建的項目。
雖然可以使用Properties屬性或AdditionalProperties元數據傳遞屬性,但我無法找到傳遞Items的方法。
可能的解決方案可能是將項目寫入文件並將文件名作爲屬性傳遞,但這隻會傳遞項目,而不會傳遞其元數據。將項目傳遞給MSBuild任務

有什麼想法?

謝謝。

回答

6

編寫自定義任務以將項目及其元數據轉儲到文件,以便被其他進程拾取是相當直接的。不是僅僅以原始文本形式轉儲項目,而是生成一個包含項目組(包含項目元數據)的有效MSBuild項目文件,並將由MSBuild任務執行的項目導入生成的文件。你甚至可以使用MSBuild 4.0內嵌任務來轉儲文件。

(迴應評論)

<UsingTask 
    TaskName="WriteItemsWithMetadata" 
    TaskFactory="CodeTaskFactory" 
    AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll" > 
    <ParameterGroup> 
    <OutputFile ParameterType="System.String" Required="true" /> 
    <Items ParameterType="Microsoft.Build.Framework.ITaskItem[]" Required="true" /> 
    </ParameterGroup> 
    <Task> 
    <Using Namespace="System.IO" /> 
    <Code Type="Fragment" Language="cs"> 
    <![CDATA[ 
    // This code simplified with specific knowledge 
    // of the item metadata names. See ITaskItem 
    // documentation to enable writing out arbitrary 
    // meta data values 
    // 
    using (StreamWriter writer = new StreamWriter(OutputFile)) 
    { 
    writer.Write("<?"); 
    writer.WriteLine(" version=\"1.0\" encoding=\"utf-8\"?>"); 
    writer.WriteLine("<Project xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\""); 
    writer.WriteLine(" ToolsVersion=\"4.0\">"); 
    writer.WriteLine(" <ItemGroup>"); 

    foreach (var item in Items) 
    { 
     string meta1 = item.GetMetadata("Meta1"); 
     string meta2 = item.GetMetadata("Meta2"); 
     writer.WriteLine(" <CopyItem Include=\"{0}\">", item.ItemSpec); 
     writer.WriteLine("  <Meta1>{0}</Meta1>", meta1); 
     writer.WriteLine("  <Meta2>{0}</Meta2>", meta2); 
     writer.WriteLine(" </CopyItem>"); 
    } 
    writer.WriteLine(" </ItemGroup>");  
    writer.WriteLine("</Project>");  
    } 
    ]]> 
    </Code> 
    </Task> 
</UsingTask> 

<ItemGroup> 
    <OriginalItem Include="A"> 
    <Meta1>A1</Meta1> 
    <Meta2>A2</Meta2> 
    </OriginalItem> 
    <OriginalItem Include="B"> 
    <Meta1>B1</Meta1> 
    <Meta2>B2</Meta2> 
    </OriginalItem> 
</ItemGroup> 
<Target Name="WriteItemsWithMetadata"> 
    <WriteItemsWithMetadata 
    OutputFile="Out.props" 
    Items="@(OriginalItem)" 
    /> 
    <Exec Command="type Out.props" /> 
</Target> 
+0

我怎麼能使用的MSBuild 4.0聯任務轉儲文件?有沒有一種方法可以枚舉所有的元數據來編寫它? WriteLinesToFile任務只獲取文本的「行」。 – 2011-03-28 15:32:23

+0

有想法。謝謝。 – 2011-03-28 16:48:52