我想知道为什么在以下代码中,MsBuild拒绝设置后缀元数据。它确实可以使用CreateItem任务而不是ItemGroup声明(因为CreateItem是在构建时计算的)但我不能在这里执行此操作,因为此代码位于“属性文件”中:项目没有目标,它只是一堆我在实际项目中包含的属性/项目。
<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>
目标很好,但未设置后缀元数据。
至于现在,我已经在我需要的每个项目中复制了目的地定义,但它不是很干净。如果有人有更好的解决方案,我很感兴趣!
答案 0 :(得分: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
元数据。您想要什么值作为后缀bla或bli?)
答案 1 :(得分:0)
似乎我尝试在目标之外动态设置元数据,这是不可能的。 我尝试通过批处理布局项来设置后缀元数据,但在批处理完成时未正确设置布局项。批处理是在msbuild解析我的属性文件时完成的,它不会等待声明Layout。
然而,就像MadGnome指出的那样,我可以批量处理LayoutFolder(这是我的包含的源项),因为MSBuild确实等待它被声明。
答案 2 :(得分: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 Property Functions”:( https://msdn.microsoft.com/en-us/library/dd633440.aspx)