MSBuild 3.5中众所周知的元数据+通配符

时间:2010-10-18 16:07:59

标签: .net-3.5 msbuild .net-4.0

我目前正在尝试使用MSBuild来设置项目,并且遇到了一些通配符问题。

我正在尝试使用以下代码段:

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

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

“XSD;的.xsd;的.xsd; ..... etc.xsd;”

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

有没有人知道这是一个已解决的问题,或者是否有MSBuild的补丁我不知道?

谢谢!

1 个答案:

答案 0 :(得分:2)

我有一个非常相似的问题。请参阅: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>

如果要将整个ItemGroup放在目标中,请不要忘记在声明项目后仅通过批处理来设置元数据。您必须分两步完成此操作。