2016-06-03 12 views
0

Я пытаюсь создать цель MSBuild, которая должна взять определенный файл в списке каталогов, а затем скопировать этот файл с другим именем в тот же каталог. Имя «destination» напрямую зависит от каталога.Задача MSBuild Copy + пакетная обработка метаданных корреляции

Проиллюстрируем на примере:

|-\Source\MySolution.ProjectFoo\ 
| -- App.config.tpl 
| -- MySolution.ProjectFoo.exe 
| -- (Target) MySolution.ProjectFoo.exe.config.tpl 
|-\Source\MySolution.ProjectBar\ 
| -- App.config.tpl 
| -- MySolution.ProjectBar.exe 
| -- (Target) MySolution.ProjectBar.exe.config.tpl 

Я начал строить мой ItemGroup так:

<ItemGroup> 
    <AppConfigTemplates Include="Source\**\App.config.tpl"> 
     <Correlate>%(RecursiveDir)</Correlate> 
    </AppConfigTemplates> 
    <ExeFiles Include="Source*\**\*.exe"> 
     <Correlate>%(RecursiveDir)</Correlate> 
    </ExeFiles> 
</ItemGroup> 

Я надеялся, чтобы иметь возможность партии на свойстве Correlate метаданных. Что-то вроде:

<Copy Batch="%(Correlate)" SourceFiles="%(AppConfigTemplates.FullPath)" 
          DestinationFiles="%(ExeFiles.FullPath).config.tpl" /> 

Как я могу это достичь?

ответ

1

Возможно, это возможно для «корреляции» отдельных групп элементов, подобных этому, но вам все равно нужно убедиться, что они имеют одинаковое количество элементов в одном порядке (например, что, если есть exe, но нет .tpl и vice -верса), который, скорее всего, станет беспорядочным. Более простым решением является просто перечислить файлы exe и скопировать файл tpl (который имеет фиксированное имя), если он существует:

<ItemGroup> 
    <ExeFiles Include="Source\**\*.exe"> 
    <!-- expected location of the tpl: same directory --> 
    <AppConfigTpl>%(RootDir)%(Directory)App.config.tpl</AppConfigTpl> 
    </ExeFiles> 
</ItemGroup> 

<Target Name="CopyTpl"> 
    <Copy SourceFiles="%(ExeFiles.AppConfigTpl)" 
     DestinationFiles="%(ExeFiles.FullPath).config.tpl" 
     Condition="Exists('%(ExeFiles.AppConfigTpl)') /> 
    <!-- If needed you could raise an error like this --> 
    <Error Text="oops no tpl" Condition="!Exists('%(ExeFiles.AppConfigTpl)')" /> 
</Target> 
+0

Это именно то решение, которое я ищу! Благодаря! – MarioDS