2012-05-22 39 views
6

Tôi có một tập tin văn bản, trong đó có một số địa điểm của các tập tin mà tôi muốn sao chép vào một thư mục tạm thờiMS Build sao chép danh sách các thư mục được lưu trữ tại mục

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

Bây giờ, tôi đang lấy danh sách này thành một mục

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

Bây giờ, để thêm đường dẫn đầy đủ, và thêm một số không bao gồm, tôi một lần nữa lưu trữ nó vào một ItemGroup:

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

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

CẤP:

thực tế Dir -

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

Nội dung trong O/p

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

Làm thế nào để làm cho nó sao chép "Java" và "Classes" thư mục tương ứng cũng?

+0

Bạn đang cố gắng để kết hợp các giá trị từ 2 mảng trong DestinationFiles của bạn: @ (PackageList) và @ (DirectoryList), và tôi không chắc chắn rằng bạn có thể làm điều này trong msbuild – MariusCC

Trả lời

3

Arpit, Bạn có thể sử dụng một loại giải pháp được đảo ngược: giữ trong List.txt các thư mục bạn muốn loại trừ khỏi bản sao. Dựa trên this bạn có thể tạo danh sách copyfiles bằng 2 bộ dir.

Vì vậy, giải pháp của tôi trông như thế này:

---- 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 của tôi:

<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

Bạn bỏ lỡ chỉ là một vài khoảnh khắc trong kịch bản của bạn. Trước tiên, bạn cần tạo một thư mục từ @(PackageList). Thứ hai, trong Copy Tác vụ khi bạn đặt DestinationFiles, bạn nên chỉ định thư mục con một cách rõ ràng.

Hãy xem. Kịch bản đó thực hiện công việc như bạn cần. Và nó giữ cấu trúc bên trong của tất cả các thư mục con của bạn, được chỉ định bằng ký tự đại diện. Ví dụ, 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> 
Các vấn đề liên quan