【问题标题】:Well-Known Metadata + Wildcards in MSBuild 3.5MSBuild 3.5 中众所周知的元数据 + 通配符
【发布时间】:2010-10-18 16:07:58
【问题描述】:

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

我正在尝试使用以下 sn-p:

<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 补丁?

谢谢!

【问题讨论】:

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


    【解决方案1】:

    我有一个非常相似的问题。请参阅:Scope and order of evaluation of Items in MsBuild

    在 4.0 之前的 MSBuild 中,您不能同时通过批处理自己的知名元数据来声明一个项目并设置他的一些元数据。

    不要忘记,在解析开始时,Targets 之外的 Item 会被评估一次。因此,您不能使用 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 放入您的目标中,请不要忘记仅在声明您的项目后通过批处理来设置元数据。您必须分两步执行此操作。

    【讨论】:

    • 正确,谢谢!您会惊讶于在 MSBuild 中找到有关此类内容的任何详细信息是多么困难,即使我可以访问的书籍也没有类似内容。
    • 项目评估和范围很难理解,最重要的是因为就像你说的那样文档很少。我无法访问 MsBuild 书籍,但 sedodream.com 是一个非常有趣的信息来源。据我所知,他的书也很值得一读。
    猜你喜欢
    • 2016-12-25
    • 1970-01-01
    • 1970-01-01
    • 2021-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多