Msbuild MS Build复制项目中存储的目录列表

Msbuild MS Build复制项目中存储的目录列表,msbuild,copy,msbuild-task,msbuildcommunitytasks,Msbuild,Copy,Msbuild Task,Msbuildcommunitytasks,我有一个文本文件,其中包含一些我要复制到临时目录的文件位置 ---- List.txt ---- Build\Java Build\Classes 现在,我正在将此列表提取到一个项目中 <ReadLinesFromFile File="List.txt" > <Output TaskParameter="Lines" ItemName="DirectoryList" /> </ReadLinesFromFile> O/p中的

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

---- List.txt ----
Build\Java
Build\Classes
现在,我正在将此列表提取到一个项目中

<ReadLinesFromFile File="List.txt" >
    <Output TaskParameter="Lines"
            ItemName="DirectoryList" />
</ReadLinesFromFile>
O/p中的内容

C:\temp\Debug
C:\temp\Release
C:\temp\*.class
如何使其也复制相应的“
Java
”和“
Classes
”文件夹?

arbit, 您可以使用一种相反的解决方案:将要从副本中排除的目录保留在List.txt中。 基于,您可以使用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>

c:\tmp\msiext\msiext-1.3\trunk\src
c:\tmp\

您在脚本中错过了几分钟。首先,您需要从
@(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>

.
目录.txt
临时雇员
%(DirectoryList.Identity)

您正在尝试合并目标文件@(PackageList)和@(DirectoryList)中2个数组的值,我不确定您是否可以在msbuild中执行此操作
<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>
    <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>