2012-02-10 3 views
3

Вот скрипт MSBuild:Реферирование хорошо известный метаданные элемента внутри определения метаданных в ItemGroup в мишени

<?xml version="1.0" encoding="utf-8"?> 
<Project DefaultTargets="AugmentItemGroup" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0"> 
<ItemGroup> 
    <ItmGrp Include="File1.txt"> 
     <Dest>dest\%(FileName)%(Extension)</Dest> 
    </ItmGrp> 
    <ItmGrp Include="File2.txt"> 
     <Dest>dest\%(FileName)%(Extension)</Dest> 
    </ItmGrp> 
    <ItmGrp Include="File3.txt"> 
     <Dest>dest\%(FileName)%(Extension)</Dest> 
    </ItmGrp> 
    </ItemGroup> 

    <Target Name="AugmentItemGroup"> 
    <ItemGroup> 
     <ItmGrp Include="File4.txt"> 
     <Dest>dest\%(FileName)%(Extension)</Dest> 
     </ItmGrp>   
    </ItemGroup> 
    <Message Text="%(ItmGrp.FullPath) to %(ItmGrp.Dest)" /> 
    </Target> 
</Project> 

Выход я бы ожидать от него есть:

D:\t\File1.txt to dest\File1.txt 
    D:\t\File2.txt to dest\File2.txt 
    D:\t\File3.txt to dest\File3.txt 
    D:\t\File4.txt to dest\File4.txt 

Но результат :

D:\t\File1.txt to dest\File1.txt 
    D:\t\File2.txt to dest\File2.txt 
    D:\t\File3.txt to dest\File3.txt 
    D:\t\File4.txt to dest\File1.txt 
    D:\t\File4.txt to dest\File2.txt 
    D:\t\File4.txt to dest\File3.txt 

Почему поведение %(FileName)%(Extension) хорошо известный справочник метаданных ce отличается, когда ItemGroup находится внутри цели?

Возможно ли получить поведение «снаружи цели» внутри цели?

ответ

5

Это даст желаемый результат. Хотя это может быть не правильный подход в общем случае, это не избежать пакетирование, что происходит с «file4», делая пользовательские метаданные часть определения элемента, который рассчитывается следующим образом:

<Project 
    xmlns="http://schemas.microsoft.com/developer/msbuild/2003" 
    DefaultTargets="AugmentItemGroup" 
    ToolsVersion="4.0"> 
    <ItemDefinitionGroup> 
     <ItmGrp> 
     <Dest>dest\%(FileName)%(Extension)</Dest> 
     </ItmGrp> 
    </ItemDefinitionGroup> 

    <ItemGroup> 
     <ItmGrp Include="File1.txt" /> 
     <ItmGrp Include="File2.txt" /> 
     <ItmGrp Include="File3.txt" /> 
    </ItemGroup> 

    <Target Name="AugmentItemGroup"> 
     <ItemGroup> 
     <ItmGrp Include="File4.txt" /> 
     </ItemGroup> 
     <Message Text="%(ItmGrp.FullPath) to %(ItmGrp.Dest)" /> 
    </Target> 
</Project> 

редактирования:

Если (как комментарий ниже говорит) каждый элемент имеет другое значение для% (Dest), вам просто нужно сделать окончательное значение, рассчитанное:

<Project ...> 
    <ItemDefinitionGroup> 
     <ItmGrp> 
      <_Dest /> 
     </ItmGrp> 
    </ItemDefinitionGroup> 

    <ItemGroup> 
     <ItmGrp Include="File1.txt"><Dest>dest1</Dest></ItmGrp> 
     <ItmGrp Include="File2.txt"><Dest>dest2</Dest></ItmGrp> 
     <ItmGrp Include="File3.txt"><Dest>dest3</Dest></ItmGrp> 
    </ItemGroup> 

    <Target Name="AugmentItemGroup"> 
     <ItemGroup> 
      <ItmGrp Include="File4.txt"><Dest>dest4</Dest></ItmGrp> 
      <ItmGrp> 
      <_Dest>%(Dest)\%(FileName)%(Extension)</_Dest> 
      </ItmGrp> 
     </ItemGroup> 
     <Message Text="%(ItmGrp.FullPath) to %(ItmGrp._Dest)" /> 
    </Target> 
</Project> 

Выдержки из MSBuild Trickery трюков # 70, 71

+0

Проблема с этим подходом для меня заключается в том, что часть «dest» будет отличаться от элемента к элементу, поэтому одно и то же определение не может применяться ко всем элементам в группе. – axk

+1

Хорошо, попробуйте второй подход выше. Обратите внимание на использование Dest vs. _Dest –

+0

Это помогло мне с совершенно другой задачей, спасибо. Кроме того, для ссылки на книгу я собираюсь ее купить. –