2012-05-22 2 views
6

У меня есть текстовый файл, который содержит некоторые места из файлов, которые я хочу, чтобы скопировать временную директориюMS Строить скопировать список каталогов, хранящихся в пункте

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

Теперь я выборки этот список в Пункт

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

Теперь, для того, чтобы добавить полный путь, и добавить некоторые исключает, я снова хранить его в другой ItemGroup:

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

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

ВОПРОС:

Actual Dir -

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

Содержание в O/р

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

Как сделать копию соответствующего "Java" и "Classes" папку также?

+0

Вы пытаетесь объединить значения из 2 массивов в ваших DestinationFiles: @ (PackageList) и @ (DirectoryList), и я не уверен, что вы можете сделать это в MSBuild – MariusCC

ответ

3

Arpit, Вы можете использовать какое-то обратное решение: сохранить в List.txt каталог, который вы хотите исключить из копии. На основе this вы можете создать свой список копий, используя 2 набора каталогов.

Так что мое решение выглядит следующим образом:

---- 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 

Мой 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

Вы пропустили всего несколько моментов в сценарии. Во-первых, вам нужно создать каталог из @(PackageList). Во-вторых, в Copy Задача при установке DestinationFiles вы должны явно указать подкаталог.

Посмотрите. Этот скрипт выполняет эту работу по мере необходимости. И он содержит внутреннюю структуру всех ваших подкаталогов, заданных подстановочным знаком. Например, 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>