MS Build copy a list of directories stored in Item

copy, msbuild, msbuild-task, msbuildcommunitytasks

Solution

Arpit, You can use a kind of reversed solution: keep in List.txt the dirs you want excluded from copy. Based on this you can create your copyfileslist using 2 sets of dirs.

So my solution looks like this:

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

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

Problem

I have a text file which contains some locations of the files which I want to copy to a temp directory ``` ---- List.txt ---- Build\Java Build\Classes ``` Now, I am fetching this list into an Item ``` <ReadLinesFromFile File="List.txt" > <Output TaskParameter="Lines" ItemName="DirectoryList" /> </ReadLinesFromFile> ``` Now, In order to append the full path, and add some excludes, I am again storing it into another 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: Actual Dir - ``` C:\Work\Build\Java\Debug C:\Work\Build\Java\Release C:\Work\Build\Classes\*.class ``` Content in O/p ``` C:\temp\Debug C:\temp\Release C:\temp\*.class ``` How to make it copy the corresponding "`Java`" and "`Classes`" folder also?

Original source

Related problems