可视化,理解和调试MSBuild构建过程

时间:2013-01-05 04:30:01

标签: msbuild csproj

我不明白目标是如何相互依赖的,最重要的是,变量如何通过目标图表。 我有一个具体的例子:CSC目标具有AddModules属性/属性。我想使用我的.csproj文件进行设置。正如您将在下面看到的,我尝试了许多不同的解决方案,但我不明白为什么其中一个有效,而有些则无法解决。我在代码中写了一些问题:

<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
  <PropertyGroup>
    <TargetFrameworkProfile>Profile88</TargetFrameworkProfile>
    <FileAlignment>512</FileAlignment>

    <!--1) Why don't I get fatal error here even though <AddModules> is invalid inside the <PropertyGroup>?"-->
    <!--2) Why doesn't this work (doesn't pass the AddModules to the CSC target unlike other properties like FileAlignment)?"-->
    <AddModules>$(OutputPath)Ark.Weak.netmodule</AddModules>

    <!--3) Why do I get the following fatal error here: "error  : The attribute "Include" in element <AddModules> is unrecognized."?-->
    <AddModules Include="$(OutputPath)Ark.Weak.netmodule" />
  </PropertyGroup>
  <ItemGroup>
    <!--4) Why do I get the following fatal error here? "error  : The reference to the built-in metadata "Extension" at position 1 is not allowed in this condition "'%(Extension)'=='netmodule'"."-->
    <AddModules Include="@(ReferencePath)" Condition="'%(Extension)'=='netmodule'" />

    <!--5) Why do I get the following fatal error here: "error  : The attribute "Remove" in element <ReferencePath> is unrecognized."?-->
    <ReferencePath Remove="@(AddModules)" />

    <!--6) Why does this work even though <AddModules> is invalid inside the <ItemGroup>?"-->
    <!--7) Why does this do the job (passes the AddModules to the CSC target)?"-->
    <AddModules Include="$(OutputPath)Ark.Weak.netmodule" />
  </ItemGroup>
</Project>

2 个答案:

答案 0 :(得分:2)

这是一个相当复杂的问题(关于目标依赖和变量旅行),如果我们深入研究细节,答案可以是关于msbuild的完整文章或演示文稿。

我会尝试回答您的代码示例问题并尝试尽可能简短。随意询问有关详细信息。

  1. 在PropertyGroup中AddModules无效 - 您刚刚创建了一个名为AddModules的新属性。

  2. 根据我发现 - csc任务查找名为AddModule的项目,而不是属性1。简单来说 - Msbuild Items是一种数组,属性是字符串。 @(AddModule)语法意味着它期望条目数组(将使用@()构造连接到逗号分隔的字符串)

  3. 属性没有包含属性,只允许条件。Check this reference

  4. 在这种情况下,ReferencePath是一个属性(我认为),它根本不包含元数据。 在调用ResolveAssemblyReference目标之后,将有一个具有该名称的项目。在这种情况下,我认为它尚未召唤。

  5. 删除仅适用于“文件”类型成员的属性,而不适用于任意字符串类型成员。但我仍然怀疑这个错误是因为你当时还没有@(ReferencePath)项目。Check this reference关于删除属性的更多细节。

  6. 这不是无效的。它只是变量的名称。所以它在那里完全合法。

  7. 因为csc期望item为参数,所以此语句创建它并作为全局变量发出。将在同一上下文中触发的每个目标都可以使用@(AddModule)语法访问此项目

答案 1 :(得分:1)