MS Build copia una lista de directorios almacenados en Item

Tengo un archivo de texto que contiene algunas ubicaciones de los archivos que quiero copiar en un directorio temporal

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

Ahora, estoy buscando esta lista en un elemento

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

Ahora, para agregar la ruta completa y agregar algunas exclusiones, lo estoy almacenando nuevamente en otro ItemGroup:

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

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

PROBLEMA:

Dirección real -

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

Contenido en O/p

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

Cómo hacer que copie el correspondiente "Java"Y"Classes"carpeta también?

preguntado el 22 de mayo de 12 a las 08:05

Está intentando combinar valores de 2 matrices en sus DestinationFiles: @(PackageList) y @(DirectoryList), y no estoy seguro de que pueda hacerlo en msbuild.

2 Respuestas

Te perdiste solo unos momentos en tu guión. Primero, necesita crear un directorio desde @(PackageList). Segundo, en Copy Tarea cuando configuras DestinationFiles debe especificar el subdirectorio explícitamente.

Echar un vistazo. Ese scrip hace el trabajo que necesitas. Y contiene la estructura interna de todos sus subdirectorios, especificados por comodines. Por ejemplo, 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>

contestado el 29 de mayo de 12 a las 12:05

Arpit, puede usar una especie de solución inversa: mantenga en List.txt los directorios que desea excluir de la copia. Residencia en este puede crear su copyfileslist usando 2 conjuntos de directorios.

Entonces mi solución se ve así:

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

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

contestado el 24 de mayo de 12 a las 13:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.