2013-04-18 47 views
0

我有一個元數據項目,我想複製以執行一些操作,並在多個位置發生結果,例如,我想將文件複製到多個位置:msbuild複製到項目元數據中定義的多個位置

<ItemGroup> 
    <MyItem Include="myFile.txt"> 
    <Out>c:\blah;c:\test</Out> 
    </MyItem> 
</ItemGroup> 

我將如何設置一個目標,以創建C:\胡說和c:\測試,如果他們不存在,那麼MYFILE.TXT複製到C:\等等\ MYFILE.TXT和c:\測試\ myFile.txt

如果我想在清理過程中清理它們,我還希望獲得完整輸出路徑列表(c:\ blah \ myFile.txt和c:\ test \ myFile.txt)。

回答

1

如果你不想改變你的ItemGroup結構,你需要處理,你有一個嵌套的ItemGroup(在MetaDataElement輸出)。因此,您需要將ItemGroup MyItem批量添加到目標,並且可以批量輸出。我做了一個小例子項目:

<?xml version="1.0" encoding="utf-8"?> 
<Project DefaultTargets="CopyFiles" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5"> 
<ItemGroup> 
    <MyItem Include="myFile.txt"> 
    <Out>c:\blah;c:\test</Out> 
    </MyItem> 
    <MyItem Include="myFile2.txt"> 
    <Out>c:\blah2;c:\test2</Out> 
    </MyItem> 
</ItemGroup> 

<Target Name="CopyFiles" 
     Inputs="%(MyItem.Identity)" 
     Outputs="%(MyItem.Identity)\ignore_this.msg"> 

    <PropertyGroup> 
    <File>%(MyItem.Identity)</File> 
    </PropertyGroup> 

    <ItemGroup> 
    <Folders Include="%(MyItem.Out)" /> 
    </ItemGroup> 

    <Message Text="%(Folders.Identity)\$(File)" />  
</Target> 
</Project> 

輸出將是:

Project "D:\TEMP\test.proj" on node 1 (default targets). 
CopyFiles: 
c:\blah\myFile.txt 
c:\test\myFile.txt 
CopyFiles: 
c:\blah2\myFile2.txt 
c:\test2\myFile2.txt 
Done Building Project "D:\TEMP\test.proj" (default targets). 
Build succeeded. 
0 Warning(s) 
0 Error(s) 
+0

你怎麼又停了文件被複制,如果他們沒有改變? – SupaGu

+0

這個星座很難做到,因爲你怎麼能確定它在所有地方都沒有改變?您可以添加一個seconed元數據並將其用於輸出:' c:\ blah' - >'Outputs =「%(MyItem.Reference)\%(MyItem.Identity)」' 第二種方法是在複製任務,如果文件不同。通過這種方式,您可以確保無處不在是最新版本,而不僅僅是參考位置。 – MikeR

0

你想要做的是一個叫做MSBuild Batching的概念。 它允許您將項目列表分成不同的批次,並分別將這些批次中的每個批次傳遞給一個任務。

<Target Name="CopyFiles"> 
    <ItemGroup Label="MyFolders"> 
    <Folder Include="c:\blah" /> 
    <Folder Include="C:\test" /> 
</ItemGroup> 
    <Copy SourceFiles="myFile.txt" DestinationFolder="%(Folder.Identity)\"> 
     <Output TaskParameter="CopiedFiles" ItemName="FilesCopy" /> 
    </Copy> 
</Target> 
0

如何:

<Target Name="CopyFiles"> 

    <!--The item(s)--> 
    <ItemGroup> 
     <MyItem Include="myFile.txt"/> 
    </ItemGroup> 

    <!--The destinations--> 
    <ItemGroup> 
     <MyDestination Include="c:\blah"/> 
     <MyDestination Include="c:\test"/> 
    </ItemGroup> 

    <!--The copy--> 
    <Copy SourceFiles="@(MyItem)" DestinationFolder="%(MyDestination.FullPath)" /> 
    <ItemGroup> 
     <FileWrites Include="%(MyDestination.FullPath)\*" /> 
    </ItemGroup> 

    <!--The output --> 
    <Message Text="FileWrites: @(FileWrites)" Importance="high"/> 

</Target> 
相關問題