MsBuild中项目的评估范围和顺序

时间:2010-09-02 16:41:11

标签: msbuild metadata msbuild-propertygroup

我想知道为什么在以下代码中,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>

目标很好,但未设置后缀元数据。

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

3 个答案:

答案 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