代码之家  ›  专栏  ›  技术社区  ›  Ed James

MSBuild 3.5中的已知元数据+通配符

  •  0
  • Ed James  · 技术社区  · 15 年前

    我试图使用以下代码片段:

    <Project ToolsVersion="3.5" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
      <ItemGroup>
        <Xsd Include="App_Data\*.xsd">
          <Generator>MSDataSetGenerator</Generator>
          <LastGenOutput>%(Xsd.Filename).Designer.cs</LastGenOutput>
          <SubType>Designer</SubType>
        </Xsd>
        <Xss Include="App_Data\*.xss">
          <DependentUpon>%(Xss.Filename).xsd</DependentUpon>
        </Xss>
        <Xsc Include="App_Data\*.xsc">
          <DependentUpon>%(Xsc.Filename).xsd</DependentUpon>
        </Xsc>
      </ItemGroup>
      <Target Name="PrintMetaData">
        <Message Text="@(Xss->'%(DependentUpon)')"/>
      </Target>
    </Project>
    

    使用MSBuild的3.5版本,我得到以下输出:

    使用MSBuild的4.0版本,我得到了预期的结果:文件名列表。

    是否有人知道这是解决方法的已知问题,还是缺少MSBuild的修补程序?

    谢谢!

    1 回复  |  直到 15 年前
        1
  •  2
  •   Community Mohan Dere    9 年前

    我也有类似的问题。见: Scope and order of evaluation of Items in MsBuild .

    对于4.0之前的MSBuild,不能通过同时对其自身的已知元数据进行批处理来声明项和设置其某些元数据。

    不要忘记,在解析开始时,目标之外的项会被计算一次。因此,不能在目标外部使用4.0之前的MSBuild进行批处理。因此,解决方法可以是将批处理部分(或整个声明放在目标中):

    <Project ToolsVersion="3.5" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
      <ItemGroup>
        <XsdFiles Include="App_Data\*.xsd">
          <Generator>MSDataSetGenerator</Generator>
          <SubType>Designer</SubType>
        </XsdFiles>
        <XssFiles Include="App_Data\*.xss" />
        <XscFiles Include="App_Data\*.xsc" />
      </ItemGroup>
      <Target Name="PrintMetaData">
        <ItemGroup>
          <Xsd Include="@(XsdFiles)">
            <LastGenOutput>%(XsdFiles.Filename).Designer.cs</LastGenOutput>
          </Xsd>
          <Xss Include="@(XssFiles)">
            <DependentUpon>%(XssFiles.Filename).xsd</DependentUpon>
          </Xss>
          <Xsc Include="@(XscFiles)">
            <DependentUpon>%(XscFiles.Filename).xsd</DependentUpon>
          </Xsc>
        </ItemGroup>
        <Message Text="@(Xss->'%(DependentUpon)')"/>
      </Target>
    </Project>