2012-05-22 15 views
6

ich eine Textdatei, die einige Orte der Dateien enthält, die ichMS Erstellen Sie eine Liste von Verzeichnissen in Artikel gespeichert kopieren

---- List.txt ---- 
Build\Java 
Build\Classes 

nun in ein temporäres Verzeichnis kopiert werden soll, bin ich diese Liste in ein Abrufen Artikel

<ReadLinesFromFile File="List.txt" > 
    <Output TaskParameter="Lines" 
      ItemName="DirectoryList" /> 
</ReadLinesFromFile> 

Jetzt, um den vollständigen Pfad anhängen, und einige umfasst nicht hinzufügen, ich bin Speichern wieder in eine andere ItemGroup:

<ItemGroup> 
    <PackageList Include="$(BuildPath)\%(DirectoryList.Identity)\**\*.*" 
       Exclude="$(BuildPath)\%(DirectoryList.Identity)\**\*.pdb" /> 
</ItemGroup> 

<Copy SourceFiles="@(PackageList)" 
     DestinationFiles="@(PackageList->'$(PackageTemp)\%(SourceDirectory)\%(DirInPackage)%(RecursiveDir)%(Filename)%(Extension)')" /> 

PROBLEM:

Actual Dich -

C:\Work\Build\Java\Debug 
C:\Work\Build\Java\Release 
C:\Work\Build\Classes\*.class 

Inhalt in O/p

C:\temp\Debug 
C:\temp\Release 
C:\temp\*.class 

Wie es die entsprechenden "Java" und "Classes" -Ordner auch machen kopieren?

+0

Sie versuchen, Werte von 2 Arrays in Ihrer DestinationFiles zu kombinieren: @ (Paketliste) und @ (DirectoryList), und ich bin mir nicht sicher, dass Sie dies in msbuild tun können – MariusCC

Antwort

3

Arpit, Sie können eine Art umgekehrte Lösung verwenden: Bewahren Sie in List.txt die Verzeichnisse auf, die von der Kopie ausgeschlossen werden sollen. Basierend auf this können Sie Ihre Copyfileslist mit 2 Sets von Verzeichnissen erstellen.

So sieht meine Lösung wie folgt aus:

---- List.txt ---- dirs to be excluded --- 
Demos\AccessDatabase 
Demos\ActiveDirectoryMsi 
Demos\JavaToolsMsi 
Demos\JavaToolsMsi\Data 
Demos\LocalUserGroupsMsi 
Demos\MSSQLDatabase 
Demos\StringToolsMsi 
Demos\SystemToolsMsi 
Demos\TemplateFilesMsi 
Demos\UserPrivilegesMsi 
Demos\WindowsServiceMsi 
Common 
CustomActions 
Framework 
Tools 
Version 
WixExtensions 

Mein msbuild.proj:

<Project DefaultTargets="run" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" > 
    <Target Name="run"> 
     <PropertyGroup> 
      <BuildPath>c:\tmp\msiext\msiext-1.3\trunk\src</BuildPath> 
      <PackageTemp>c:\tmp\</PackageTemp> 
     </PropertyGroup>   
     <ReadLinesFromFile File="List.txt" > 
      <Output TaskParameter="Lines" 
       ItemName="DirectoryList" /> 
     </ReadLinesFromFile> 
     <Message Text="DirectoryList: @(DirectoryList)" /> 
     <ItemGroup> 
      <PackageList Include="$(BuildPath)\%(DirectoryList.Identity)\**\*.*" 
       Exclude="$(BuildPath)\%(DirectoryList.Identity)\**\*.sql" /> 
     </ItemGroup> 
     <!--<Message Text="PackageList: @(PackageList)" />--> 

     <Message Text="----------------------------------------------------------------------------" /> 
     <CreateItem Include="$(BuildPath)\**\*.*" Exclude="@(PackageList)"> 
      <Output TaskParameter="Include" ItemName="NeededFiles"/> 
     </CreateItem> 

     <Message Text="NeededFiles: @(NeededFiles)" /> 
     <Message Text="----------------------------------------------------------------------------" /> 
     <Copy SourceFiles="@(NeededFiles)" DestinationFiles="@(NeededFiles->'$(PackageTemp)\%(RecursiveDir)\%(Filename)%(Extension)')" /> 
    </Target> 
</Project> 
3

Sie verfehlten nur ein paar Momente in Ihrem Skript. Zuerst müssen Sie ein Verzeichnis von @(PackageList) erstellen. Zweitens, in Copy Aufgabe, wenn Sie DestinationFiles setzen, sollten Sie explizit Unterverzeichnis angeben.

Werfen Sie einen Blick. Dieser Scrip erledigt die Arbeit wie Sie brauchen. Und es enthält die interne Struktur all Ihrer Unterverzeichnisse, die durch Platzhalter angegeben sind. Zum Beispiel Java\Debug\Component1\file.ext

<Project DefaultTargets="CopyDirectories" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <PropertyGroup> 
     <BuildPath>.</BuildPath> 
     <SourceDirectoryListFile>Directories.txt</SourceDirectoryListFile> 
     <DestinationDirectory>temp</DestinationDirectory> 
    </PropertyGroup> 

    <Target Name="ReadDirectoryList"> 
     <ReadLinesFromFile File="$(SourceDirectoryListFile)" > 
      <Output TaskParameter="Lines" 
        ItemName="DirectoryList" /> 
     </ReadLinesFromFile> 
    </Target> 

    <Target Name="CopyDirectories" DependsOnTargets="ReadDirectoryList" 
      Outputs="%(DirectoryList.Identity)"> 
     <PropertyGroup> 
      <ProcessingDirectory>%(DirectoryList.Identity)</ProcessingDirectory> 
     </PropertyGroup> 
     <ItemGroup> 
      <PackageList Include="$(BuildPath)\$(ProcessingDirectory)\**\*.*" 
         Exclude="$(BuildPath)\$(ProcessingDirectory)\**\*.pdb" /> 
     </ItemGroup> 
     <MakeDir Directories="$(ProcessingDirectory)" /> 
     <Copy SourceFiles="@(PackageList)" 
       DestinationFiles="@(PackageList->'$(DestinationDirectory)\$(ProcessingDirectory)\%(RecursiveDir)%(Filename)%(Extension)')" /> 
    </Target>