2010-09-02 74 views
0

我想知道为什么在下面的代码中,MsBuild拒绝设置后缀元数据。它可以使用CreateItem任务而不是ItemGroup声明(因为CreateItem是在构建时计算的),但我不能在这里这样做,因为此代码位于“属性文件”中:项目没有目标,它只是一堆我在实际项目中包含的物业/物品。MsBuild中项目的评估范围和顺序

<ItemGroup> 
     <Layout Include="Bla"> 
      <PartnerCode>bla</PartnerCode> 
     </Layout> 
     <Layout Include="Bli"> 
      <PartnerCode>bli</PartnerCode> 
     </Layout> 
</ItemGroup> 

<ItemGroup Condition="'$(LayoutENV)'=='Preprod'"> 
     <LayoutFolder Include="Preprod"> 
      <Destination>..\Compil\layout\pre\</Destination> 
     </LayoutFolder> 
</ItemGroup> 


<ItemGroup> 
    <Destinations Include="@(LayoutFolder)" > 
     <Suffix>%(Layout.PartnerCode)</Suffix> 
    </Destinations> 
</ItemGroup> 

目的地建好了,但未设置后缀元数据。

至于现在,我已经在每个需要它的项目中复制了Destinations Definition,但它并不是很干净。如果有人有更好的解决方案,我很感兴趣!

回答

0

看来我尝试在不可能的目标之外动态设置元数据。 我尝试通过对布局项目进行批处理来设置后缀元数据,但在完成批处理时布局项目未正确设置。批处理是在msbuild解析我的属性文件时完成的,它不会等待布局被声明。不过,像MadGnome指出的那样,我可以对LayoutFolder(这是我的包含的源项)进行批处理,因为MSBuild确实在等待它的声明。

2

随着MSBuild 4,你可以使用以前项的元数据项声明是这样的:

<ItemGroup> 
    <Layout Include="Bla"> 
     <PartnerCode>bla</PartnerCode> 
    </Layout> 
    <Layout Include="Bli"> 
     <PartnerCode>bli</PartnerCode> 
    </Layout> 
</ItemGroup> 

<ItemGroup> 
    <Destinations Include="@(Layout)" > 
     <Suffix>%(PartnerCode)</Suffix> 
    </Destinations> 
</ItemGroup> 

(很奇怪,你批上LayoutFolder,并试图让Layout元你要为后缀喇嘛什么样的价值。或bli?)

+0

其实,我可以。我做了好几次。如果您明确写入要批量处理的项目组名称(如%(LAYOUT.PartnerCode)),那很好。 但是,如果不在目标元素中,也许我无法进行批处理... – 2010-09-03 09:32:01

+0

如果您在Destinations.Suffix中编写%(Layout.PartnerCode),您要什么值? bla或bli? – 2010-09-03 09:48:40

+0

比方说Layout.Count = n。我想要一个包含2n个物品的集合:布局中的所有物品,一次是bla,另一个是bli。 – 2010-09-06 07:51:48

0

您遇到的问题是您指的是列表中的元数据。 %(Layout.PartnerCode)遍历“布局”的ItemGroup,在这种情况下返回2个项目。即使使用1,它也会导致不希望的意外结果,因为您指向列表。 MSBuild返回两个元标记,并不知道你想要哪一个。结果是,它没有选择,而是......或者,MSBuild最终将其设置为无。

我建议设置默认ItemDefinition,像这样(的MSBuild 3.5)

<ItemDefinitionGroup> 
    <Layout> 
    <PartnerCode>%(Identity)</PartnerCode> 
    <Suffix>%(PartnerCode)</Suffix> 
    <Destination Condition="'$(LayoutENV)'=='Preprod'">..\Compile\layout\pre\</Destination> 
    </Layout> 
</ItemDefinitionGroup> 

,然后定义他们为你会有。

<ItemGroup> 
    <Layout Include="Bla" /> 
    <Layout Include="Bli" /> 
    <Layout Include="Bloop"> 
     <PartnerCode>B2</PartnerCode> 
     <Suffix>%(PartnerCode)</Suffix> 
    </Layout> 
</ItemGroup> 

图片的标题说明


注意。元数据似乎只对每个定义组/项目组进行一次解析,因此如果您要设置PartnerCode,则还必须重置后缀,如第二个示例所示。 我不熟悉MSBuild 3.5中的行为,但MSBuild 4.0中就是这种情况。

备注。我假设你想要你的文件名作为后缀,Identity有窍门,请参阅这里“MSBuild知名项目元数据”:(https://msdn.microsoft.com/en-us/library/ms164313.aspx),如果不是这种情况,你可以随时遵循自定义覆盖示例或写基于它的你自己的功能。在这里阅读更多有关“MSBuild属性功能”的内容:(https://msdn.microsoft.com/en-us/library/dd633440.aspx