MS Build复制存储在Item中的目录列表

时间:2012-05-22 07:01:21

标签: msbuild copy msbuild-task msbuildcommunitytasks

我有一个文本文件,其中包含我要复制到临时目录的文件的某些位置

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

现在,我将此列表提取到Item

<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)')" />

ISSUE:

实际目录 -

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

O / p中的内容

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

如何复制相应的“Java”和“Classes”文件夹?

2 个答案:

答案 0 :(得分:3)

Arpit, 您可以使用一种反向解决方案:在List.txt中保留要从副本中排除的目录。 基于this,您可以使用2组dirs创建复制文件列表。

所以我的解决方案如下:

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

答案 1 :(得分:3)

您在脚本中错过了一些时间。首先,您需要从@(PackageList)创建一个目录。其次,在设置Copy的{​​{1}}任务中,您应该明确指定子目录。

看一看。该脚本可以根据您的需要完成工作。它保存所有子目录的内部结构,由通配符指定。例如,DestinationFiles

Java\Debug\Component1\file.ext