1

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

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

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

4

3 回答 3

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?)

于 2010-09-02T17:02:41.647 回答
0

看来我尝试在不可能的目标之外动态设置元数据。我尝试通过对布局项进行批处理来设置后缀元数据,但是在批处理完成时布局项设置不正确。批处理在 msbuild 解析我的属性文件时完成,它不会等待 Layout 被声明。

尽管如此,就像 MadGnome 指出的那样,我可以批量处理 LayoutFolder(这是我包含的源项),因为 MSBuild 确实等待它被声明。

于 2010-10-19T13:58:50.917 回答
0

您遇到的问题是您引用列表中的元数据。迭代“布局”的%(Layout.PartnerCode)ItemGroup,在这种情况下返回 2 个项目。即使使用 1 它也会导致不希望的、意外的结果,因为您指向一个列表。MSBuild 返回两个元标记,但不知道您想要哪一个。结果是它选择了 none ......或者......好吧,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,您还必须重置 Suffix,如第二个示例所示。我不熟悉 MSBuild 3.5 中的行为,但在 MSBuild 4.0 中就是这种情况。

注意。我假设您希望您的文件名作为后缀,Identity可以解决问题,请参阅此处“MSBuild Well-known Item Metadata”:(https://msdn.microsoft.com/en-us/library/ms164313.aspx),如果不是这种情况,您始终可以遵循自定义覆盖示例或基于它编写自己的函数。在这里阅读更多关于“MSBuild Property Functions”的内容:(https://msdn.microsoft.com/en-us/library/dd633440.aspx

于 2017-05-09T19:00:33.523 回答