MS Build скопируйте список каталогов, хранящихся в элементе

StackOverflow https://stackoverflow.com//questions/10697267

Вопрос

У меня есть текстовый файл, содержащий некоторые местоположения файлов, которые я хочу скопировать во временный каталог.

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

Теперь я извлекаю этот список в элемент

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

ПРОБЛЕМА:

Фактическая режиссура -

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

Содержимое в О/П

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

Как заставить его скопировать соответствующий "Java" и "Classes"Папка тоже?

Это было полезно?

Решение

ПРОИЗВОДСТВО, Вы можете использовать вид обратного решения: храните в Lists.txt Дирижем, которые вы хотите исключить из копирования. Основываясь на Это вы можетеСоздайте свой COPYFILESSLIST, используя 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>
.

Другие советы

Вы упустили всего несколько моментов в своем сценарии.Сначала вам нужно создать каталог из @(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>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top