代码之家  ›  专栏  ›  技术社区  ›  Benjamin Baumann

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

  •  1
  • Benjamin Baumann  · 技术社区  · 14 年前

    我想知道为什么在下面的代码中,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 回复  |  直到 7 年前
        1
  •  2
  •   Julien Hoarau    14 年前

    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需要什么值?)

        2
  •  0
  •   Benjamin Baumann    14 年前

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

    不过,正如Magnome指出的那样,我可以对layoutfolder(这是includes的源项)进行批处理,因为msbuild确实等待它被声明。

        3
  •  0
  •   Biepbot Von Stirling    7 年前

    您遇到的问题是,您在引用列表中的元数据。这个 %(Layout.PartnerCode) 迭代“layout”的itemgroup,在本例中返回2个项。即使使用1,它也会导致意外的结果,正如您所指向的列表。msbuild返回两个元标记,但不知道要使用哪个元标记。结果是,它选择了“无”…或…嗯,msbuild最终设置为Nothing。

    我建议设置一个默认项定义,如(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 )