Search code examples
msbuildcopymsbuild-taskmsbuildcommunitytasks

MS Build copy a list of directories stored in Item


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?


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>